Java使用IO类库读取文本
对于初学Java的人来说,IO类库算是比较头疼的部分,在这里就做一个演示供大家参考,在Java中,IO部分是使用装饰器模式来实现的(Java本来想弄个简单粗暴的IO系统。结果却很悲剧),所以这也是初学者感到Java.io很难的部分原因,装饰器模式我用相片和相框来比喻(并不很准确)。在Java.io中FileReader就是相片,而BufferedReader就是相框,然后把相片放进相框里就可以拿来欣赏啦。还有一个愁人的问题就是File类,这个类乍一看就是指的文件本身,但其实这个类指的只是文件名,或者目录名(我当时也搞错了,看了《Java编程思想》才知道)。
现在上代码:
ackage com.baohanbin.io_demo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
/**
*
* 1:实现由标准输入设备读入多行数据,写入file1.Txt文件<br>
* 读出file1.txt的内容,输出到标准设备,验证写入的内容。<br>
* 2:拷贝一个文件到另个文件<br>
* 由命令行参数读入输入文件名和输出文件名<br>
*
* @author 包汉彬同学
*
*/
public class IODemo {
// 从控制台输入内容时默认的输出文件名
public static String DefaultFileName = "F:\\file1.txt";
/**
* 由命令行参数读入输入文件名和输出文件名<br>
* 如果没有参数则从屏幕读入文本,将其写入"F:\\file1.txt"中<br>
*
* @param srg
* : srg[0]=>输入文件名 <br>
* srg[1]=>输出文件名
*/
public static void main(String[] srg) {
/*
* 判断命令行的参数的个数 如果有两个,则将第一个文件的内容拷贝到第二个文件中
* 不是,则从屏幕读入文本,将其写入"F:\\file1.txt"中
*/
if (srg.length == 2) {
File file1 = new File(srg[0]);
File file2 = new File(srg[1]);
String s = null;
try {
// 读取file1的内容到s中
s = readerFile(file1);
System.out.println("读取 " + srg[0] + " 文件成功!");
} catch (IOException e) {
// TODO Auto-generated catch block
System.err.println("读取文件失败!请确定文件名是否正确");
e.printStackTrace();
}
try {
// 将s的内容写入file2中
writerFile(file2, s);
System.out.println("写入 " + srg[1] + " 文件成功!");
} catch (IOException e) {
// TODO Auto-generated catch block
System.err.println("写入文件失败!请确定文件名是否正确");
e.printStackTrace();
}
} else {
try {
// 从控制台读取内容到DefaultFileName中
consoleWriterFile(new File(DefaultFileName));
System.out.println("输入结束:输出文件的内容");
// 读取DefaultFileName的内容到s中
String s = readerFile(new File(DefaultFileName));
// 将s的内容显示到控制台上
System.out.println(s);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 将text中的内容写入file中<br>
*
* @param file
* 待写入内容的文件名对象
* @param text
* 需要写入的内容
* @throws IOException
*/
public static void writerFile(File file, String text) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(text);
writer.close();
}
/**
* 从一个file对象中读取文本文字,并返回该文本
*
* @param file
* 需要读取内容的文件名对象
* @return 用String返回file的内容
* @throws IOException
*/
public static String readerFile(File file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuilder sBuider = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sBuider.append(line);
// 在reader读取一行时会自动去掉换行符,所以在这里加上
sBuider.append("\r\n");
}
reader.close();
return sBuider.toString();
}
/**
* 从控制台读取文本,直到输入“end!”结束读入<br>
* 之后将读取的文本储存在file对象中
*
* @param file
* 要保存屏幕内容的文件名对象
* @throws IOException
*/
public static void consoleWriterFile(File file) throws IOException {
System.out.println("默认文件路径为 " + DefaultFileName + "输入文本用end!结束 :开始输入");
Scanner scanner = new Scanner(System.in);
StringBuilder sBuilder = new StringBuilder();
while (!scanner.hasNext("end!")) {
sBuilder.append(scanner.nextLine());
// 在scanner读取一行时会自动去掉换行符,所以在这里加上
sBuilder.append("\r\n");
}
/*
* 不关闭scanner会出现警告“Resource leak: 'scanner' is never closed” 但程序依然可以运行
*/
scanner.close();
writerFile(file, sBuilder.toString());
}
}
项目也也可以在这里直接IODemo下载,然后用Eclipse打开。
这里因为只关心面向字符的操作所以用Reader类族来实现,如果关心面向字节的操作就用InputStream来实现。
温馨提示:在Eclipse中想添加命令行参数的话,在Package Explorer右键点击你的工程名然后Run->Run Configurations,然后在弹出的对话框里切换到Arguments页面,在Program arguments:框里添加参数就可以了。