总结:对于输出到文件操作,用pw最省事,带换行、带刷新,名称短。
这里通过三组方法来实现文件复制,并揭示一个小现象。
FileReader 与PrintWriter 比较简便的文本操作方法
FileInputStream 与FileOutputStream 任何类型的文件都适用
BufferedReader 与BufferedWriter 带缓冲区,效率高
/**
* 复制硬盘上的文件,将f.txt数据复制到write.txt
* @throws Exception
*/
private static void readData1() throws Exception {
//关联一个本地文件,f.txt,不加路径表示是当前目录
//eclispe当期目录是当前的java project在硬盘的位置
FileReader fr = new FileReader("f.txt");
//关联一个硬盘上的文件,用于输出数据
PrintWriter pw = new PrintWriter("write.txt");
char[] buf = new char[1024]; //用char数组来存储读到的数据
int len = 0; //用于表示char数组中新读取到的数据长度
while((len=fr.read(buf))!=-1) //-1表示读到文件末尾,没读到文件末尾就一直读
{
//输出数据
//最后一个char数组可能不是读满1024个字符,所以要指定输出的char数组的长度
//因为print不支持输出指定长度的char数组,所以转成String,否则文件末尾会有很多空格
pw.println(new String(buf,0,len));
}
fr.close(); //fr调用了底层资源,关闭资源
pw.close(); //关闭资源,也起到了将数据刷到硬盘的作用
}
打开write.txt发现文件最后一行比源文件多了一个换行。是因为用了pw的println的原因吗?
用字节输出流来写数据试试。
/**
* 复制硬盘上的文件,将f.txt数据复制到write.txt
* @throws Exception
*/
private static void readData2() throws Exception {
//源文件
FileInputStream fis = new FileInputStream("f.txt");
//关联一个硬盘上的文件,用于输出数据
FileOutputStream fos = new FileOutputStream("write.txt");
byte [] buf = new byte[1024]; //用byte数组来存储读到的数据
int len = 0; //用于表示char数组中新读取到的数据长度
while((len=fis.read(buf))!=-1) //-1表示读到文件末尾,没读到文件末尾就一直读
{
//输出数据
//最后一个char数组可能不是读满1024个字符,所以要指定输出的char数组的长度
//因为print不支持输出指定长度的char数组,所以转成String,否则文件末尾会有很多空格
fos.write(buf,0,len);
}
//关闭资源
fis.close();
fos.close();
}
这次新文件最后没有换行了。
再试试用bufferwriter写数据
/**
* 复制硬盘上的文件,将f.txt数据复制到write.txt
* @throws Exception
*/
private static void readData3() throws Exception{
//源文件
BufferedReader bufr = new BufferedReader(new FileReader("f.txt"));
//关联一个硬盘上的文件,用于输出数据
BufferedWriter bufw = new BufferedWriter(new FileWriter("write.txt"));
String line = null; //用line来存储读到的一行数据
while((line=bufr.readLine())!=null) //null表示读到文件末尾,没读到文件末尾就一直读
{
//输出数据
bufw.write(line);
bufw.newLine(); //写一个换行符
bufw.flush(); //将数据刷到硬盘上
}
//关闭资源
bufr.close();
bufw.close();
}
发现,新文件最后这次也多了个换行。
这里也是因为写了最后一行数据后,又写了一个换行符bufw.newLine();
所以还是字节流比较规范。