JAVA字符流复制文件的几种方式

一、注意事项

1.字符流也可以拷贝文本文件,但不推荐使用

因为读取时会把字节转为字符,写出时还要把字符转回字节。

2.不可以拷贝非纯文本的文件

因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替;写出的时候会将字符转换成字节写出去,如果是?,直接写出,这样写出之后的文件就会产生乱码。

3.使用情况

程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流

读取的时候是按照字符的大小读取的,不会出现半个中文

写出的时候可以直接将字符串写出,不用转换为字节数组

二、方法一

public static void demo1() throws FileNotFoundException, IOException {
   FileReader fr = new FileReader("xxx.txt");
   FileWriter fw = new FileWriter("zzz.txt");
   
   int c;
   while((c = fr.read()) != -1) {
      fw.write(c);
   }
   
   fr.close();
   fw.close();             
}

注:Writer类中有一个2k的小缓冲区,如果不关流,就会将内容写到缓冲区里;关流会将缓冲区内容刷新,再关闭

private char[] writeBuffer;

private static final int WRITE_BUFFER_SIZE = 1024;

三、方法二(自定义字符数组的拷贝)

public static void demo3() throws FileNotFoundException, IOException {
   FileReader fr = new FileReader("xxx.txt");
   FileWriter fw = new FileWriter("yyy.txt");
   
   char[] arr = new char[1024*8];
   int len;
   while((len = fr.read(arr)) != -1) {          //将文件上的数据读取到字符数组中
      fw.write(arr,0,len);               //将字符数组中的数据写到文件上
   }
   
   fr.close();
   fw.close();
}

四、方法三(带缓冲的字符流)

BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数,,提高效率

BufferedWriter的write()方法写出字符时会先写到缓冲区,缓冲区写满时才会写到文件,降低写文件的次数,提高效率

BufferedReader(Reader in)
          创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedWriter(Writer out)
          创建一个使用默认大小输出缓冲区的缓冲字符输出流。
public static void main(String[] args) throws IOException {
   BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
   BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
   
   int c;
   while((c = br.read()) != -1) {
      bw.write(c);
   }
   
   br.close();
   bw.close();
}

 五、方法四(带缓冲区流中的特殊方法)

StringreadLine()
          读取一个文本行。
 voidnewLine()
          写入一个行分隔符。
public static void main(String[] args) throws IOException {
   BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
   BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));
   
   String line;
   while((line = br.readLine()) != null) {
      bw.write(line);
      bw.newLine();                      //bw.write("\r\n");   
   }
   
   br.close();
   bw.close();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值