A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李会成 于 2013-2-18 11:26 编辑

做题的时候遇到字符流和字节流处理复制文本文件的一点小问题有点迷糊,请大家帮帮忙!
之前做基础测试的时候,有一题要我们写一个最快的复制文件的程序。于是我去查了一下,发现复制文件的处理方法可以通过字节流和字符流两种方式来处理。一般来说,二进制文件比如:音频之类的只能通过字节流来处理,文本文件[本质上也可以说是二进制文件]可以通过字符流和字节流两种方式来处理。但是在查资料的时候,看到有人说文本文件最好用字符流来处理,因为字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。就是说,字节流处理Unicode编码的文件时有可能出现乱码。
然后我为了看看效果,就自己看着API编了一个小程序。实验用的文本文件里面的内容是unicode编码才能保存下来的字符。然后我分别用字节流方式和字符流方式来复制这个文件。
但是结果大大超出我的意料。字节流方式复制的文件里面的内容是正确的,相反字符流方式复制里面的内容则出现了乱码。难道是我看资料的时候理解错误了?但是API里面不也是叫处理文本文件的时候用FileReader类和FileWriter类么?
我把代码贴一下,大家帮我看看吧,我试验了好几个文件都是这样的。
  1. import java.io.*;
  2. import java.util.Date;

  3. class TimeTest
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 //计算通过字符流实现复制所耗费的时间
  8.                 try{
  9.                         long da1= (new Date()).getTime();   
  10.                         BufferedReader bin = new BufferedReader(new FileReader("E:\\复件 Q.骑士.txt"));//读取文件内容
  11.                         PrintWriter pout = new PrintWriter(new BufferedWriter(new FileWriter("D:\\复件 Q.骑士.txt")));//向文件中写入内容
  12.                         String s1;
  13.                         while((s1 = bin.readLine())!=null)
  14.                         {
  15.                                 pout.write(s1);
  16.                         }
  17.                         bin.close();
  18.                         pout.close();
  19.                    long da2= (new Date()).getTime();  
  20.                    System.out.println("通过字符流实现复制所耗费的时间:"+(da2-da1));
  21.                 }catch(FileNotFoundException e1){
  22.                         e1.printStackTrace();
  23.                 }catch(IOException e2){
  24.                         e2.printStackTrace();
  25.                 }
  26.                  //计算通过字节流实现复制操作所耗费的时间        
  27.                  try
  28.                 {
  29.                         long da3= (new Date()).getTime();
  30.                         FileInputStream fin = new FileInputStream("E:\\Q.骑士.txt");
  31.                         FileOutputStream fout = new FileOutputStream("D:\\Q.骑士.txt");
  32.                         byte[] buffer = new byte[1024*2];
  33.                         int bytelenth = fin.read(buffer);
  34.                         while(bytelenth!=-1)
  35.                         {
  36.                                 fout.write(buffer,0,bytelenth);
  37.                                 bytelenth = fin.read(buffer);
  38.                         }
  39.                         fin.close();
  40.                         fout.close();
  41.                         long da4= (new Date()).getTime();
  42.                         System.out.println("通过字节流实现复制所耗费的时间:"+(da4-da3));
  43.                 }        catch(FileNotFoundException e1){
  44.                         e1.printStackTrace();
  45.                 }catch(IOException e2){
  46.                         e2.printStackTrace();
  47.                         }
  48.         }
  49. }
复制代码
我觉得问题是出在复制过去的文件的编码上请看下图:字符流复制了文件之后文件的编码变成ANSI的了。
内容.zip (419 Bytes, 下载次数: 245)





2 个回复

倒序浏览
你拷贝的时候,要指定编码,不然的话,会默认使用系统的编码。
回复 使用道具 举报
请勿复制他人帖子,技术分不是入学的门槛而是为了帮助大家学习而存在的。

请勿再次发此类帖子了!

此贴就关闭了。此后如有再次发现直接封禁处理,请看到此贴的会员也加以注意。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马