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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 自由自在2014 中级黑马   /  2014-2-9 14:44  /  1894 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

           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) 为什么老出错 ?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

10 个回复

倒序浏览
OutputStreamWriter的write方法是这样的void write(String str, int off, int len) 参数不对,sb是StringBuilder

改为 osw.write(sb.toString());

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
对不起,更正一下:改为 osw.write(sb.toString(),0,sb.length());
回复 使用道具 举报
lixiuliang 发表于 2014-2-9 14:55
对不起,更正一下:改为 osw.write(sb.toString(),0,sb.length());

我的a文件里是abcd 复制的b文件里是98100 为什么??
回复 使用道具 举报
写文本文件不需要用转换流,字符流或者字符缓存流都可以

   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();   

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
楼主读是用的字符流,写是用的字节转换字符流 ,我都差点看晕了;还是统一下比较好;我改了下
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
2424308 发表于 2014-2-9 15:22
写文本文件不需要用转换流,字符流或者字符缓存流都可以

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

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

...

这样写是对的 但为什么不用bufferWriter bufferReader 就复制错呢?
回复 使用道具 举报
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();   
回复 使用道具 举报
之所以使用BufferedWriter和BufferedReader可以正常复制出来字母的原因是:
readLine方法的底层封装了一个数组用来暂时存储读取到的数据,当读取到换行符时,说明该行数据读取结束,readLine方法会将读取到的这一行数据变成字符串。
这是我的理解,希望可以帮到你。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
也,许。 发表于 2014-2-9 16:52
之所以使用BufferedWriter和BufferedReader可以正常复制出来字母的原因是:
readLine方法的底层封装了一个 ...

谢谢,只能这样先理解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马