Java中IO流-25-IO字符流拷贝文件

前面我们分别学习了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,图片等
-- 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会出现用问号(?)代替,写出就会将字符转换字节写出去。如果是?,直接写出,这样写出之后文件就乱了,例如图片无法正常打开,音频文件受损。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值