前面我们分别学习了FileReader和FileWriter,一个是读字符流,一个是写字符流的。那么,有了这两个读写功能,我们就可以实现文件的拷贝,只不过和前面不同,这次是利用字符流来实现拷贝过程。
1.字符流拷贝文件基本代码
package io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo3_Copy {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("xxx.txt");
FileWriter fw = new FileWriter("yyy.txt");
int c;
while ( ( c = fr.read()) != -1) {
fw.write(c);
}
fr.close();
fw.close();
}
}
上面xxx.txt是前面一篇文章中运行代码创建出来,运行本次代码,然后检查yyy.txt的内容和xxx.txt是不是一致。这段就是字符流实现拷贝文件的基础代码。
2.FileWriter的底层实现
前面一篇,文章后面简单说了下Writer方法底层是转换字节写入文件的。先来看看一个问题,如果上面代码注销fw.close()这行,运行会发现yyy.txt打开是空的。空文件,说明没有保存或者还在缓冲区,也就是内存中。那么就ctrl+鼠标左键点击FileWriter,产看源码,并没有发现使用了缓冲区的原理。然后,查找直接父类OutputStreamWriter,还是没有看到缓冲区的字节数组,不着急,继续往上一层父类找。打开Writer类,这次看到了这行代码“private char[] writeBuffer;”,说明底层确实采用了缓冲区的原理。
3.什么情况下使用字符流
-- 字符流也可以拷贝文本文件,但是不推荐使用,因为读取时候会把字节转换为字符,写出的时候还要把字符转回字节。转来转去,麻烦,多出步骤,效率不高。
-- 程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流。
-- 读取的时候是按照字符大小来,所以不会出现半个中文字符,也就不会产生乱码,写也是同样道理。
4.字符流是否可以拷贝非文本文件
-- 不可以拷贝非文本的文件,例如mp3,图片等
-- 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会出现用问号(?)代替,写出就会将字符转换字节写出去。如果是?,直接写出,这样写出之后文件就乱了,例如图片无法正常打开,音频文件受损。