黑马程序员技术交流社区

标题: 关于IO流的文件复制问题 [打印本页]

作者: 自由自在2014    时间: 2014-2-9 14:44
标题: 关于IO流的文件复制问题
           FileReader fr=new FileReader("E:\\a.txt");
           StringBuilder sb= new StringBuilder();
            while (fr.read()!=-1){
                    sb.append(fr.read());
            }  
                fr.close();
            OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("E:\\b.txt"));
            osw.write(sb);
            osw.close();   


osw.writer(sb) 为什么老出错 ?
作者: lixiuliang    时间: 2014-2-9 14:48
OutputStreamWriter的write方法是这样的void write(String str, int off, int len) 参数不对,sb是StringBuilder

改为 osw.write(sb.toString());
作者: lixiuliang    时间: 2014-2-9 14:55
对不起,更正一下:改为 osw.write(sb.toString(),0,sb.length());
作者: 自由自在2014    时间: 2014-2-9 15:20
lixiuliang 发表于 2014-2-9 14:55
对不起,更正一下:改为 osw.write(sb.toString(),0,sb.length());

我的a文件里是abcd 复制的b文件里是98100 为什么??

作者: 2424308    时间: 2014-2-9 15:22
写文本文件不需要用转换流,字符流或者字符缓存流都可以

   FileReader fr=new FileReader("E:\\a.txt");
            StringBuilder sb= new StringBuilder();
             while (fr.read()!=-1){
                     sb.append(fr.read());
             }  
                 fr.close();
             FileWriter fo = new FileWriter("E:\\b.txt");
             fo.write(sb.toString());
             fo.close();   
作者: 糖伯貓    时间: 2014-2-9 15:25
楼主读是用的字符流,写是用的字节转换字符流 ,我都差点看晕了;还是统一下比较好;我改了下
  1. import java.io.*;
  2. class test{
  3.         public static void main(String[] args)throws Exception {
  4.                 BufferedReader br = new BufferedReader(new FileReader("E:\\a.txt"));
  5.                 BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\b.txt"));

  6.                 String line="";
  7.                 while((line = br.readLine())!=null){
  8.                         bw.write(line);
  9.                         bw.flush();
  10.                 }
  11.                 bw.close();
  12.         }
  13. }
复制代码


作者: 自由自在2014    时间: 2014-2-9 15:41
2424308 发表于 2014-2-9 15:22
写文本文件不需要用转换流,字符流或者字符缓存流都可以

   FileReader fr=new FileReader("E:\\a.txt");

改了后 还是 a文件里是abcd 复制的b文件里是98100 为什么??
作者: 自由自在2014    时间: 2014-2-9 15:46
糖伯貓 发表于 2014-2-9 15:25
楼主读是用的字符流,写是用的字节转换字符流 ,我都差点看晕了;还是统一下比较好;我改了下

...

这样写是对的 但为什么不用bufferWriter bufferReader 就复制错呢?
作者: 也,许。    时间: 2014-2-9 16:43
FileInputStream方法的read方法的返回值为int类型,即它读取到的数据的ASCII码值。sb.append( )方法存入的也就是数字。所以你文件中的数据虽然是字母,复制以后得到的是数字。
  FileReader fr=new FileReader("E:\\a.txt");
           StringBuilder sb= new StringBuilder();
            while (fr.read()!=-1)//在这里第一次读取数据,读取文件中的第一个字节
            {
                    sb.append(fr.read());//在这里又调用了一次read方法,
                    // 是第二次读取数据,读取到的为第二个字    节,b的ASCII码值98
                    //第一次读取到的a的ASCII码值,你并没有存储呀。所以开头就是98,接下来是100
            }  
                fr.close();
            OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("E:\\b.txt"));
            osw.write(sb);
            osw.close();   

作者: 也,许。    时间: 2014-2-9 16:52
之所以使用BufferedWriter和BufferedReader可以正常复制出来字母的原因是:
readLine方法的底层封装了一个数组用来暂时存储读取到的数据,当读取到换行符时,说明该行数据读取结束,readLine方法会将读取到的这一行数据变成字符串。
这是我的理解,希望可以帮到你。
作者: 自由自在2014    时间: 2014-2-9 17:21
也,许。 发表于 2014-2-9 16:52
之所以使用BufferedWriter和BufferedReader可以正常复制出来字母的原因是:
readLine方法的底层封装了一个 ...

谢谢,只能这样先理解




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2