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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© love~陌 中级黑马   /  2014-4-16 17:48  /  1085 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public static void main(String[] args) throws Exception {
  2.                 FileReader fr=new FileReader("E:\\a.txt");
  3.                 BufferedReader br=new BufferedReader(fr);
  4.                 char[] ch=new char[15];
  5.                 while((fr.read())!=-1){
  6.                         br.read(ch);
  7.                 }
  8.                
  9.                 Arrays.sort(ch);
  10.                
  11.                 BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\b.txt"));
  12.                
  13.                 bw.write(ch, 0, ch.length);
  14.                
  15.                 br.close();
  16.                 bw.close();       
  17.                
  18.         }
复制代码


a.txt的内容假设为为字符串“abcd”
为什么运行我这个代码,写到b.txt以后,第一个字符总是丢失(实际上是空格)
求大神指点

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

11 个回复

倒序浏览
  1. while((fr.read())!=-1){
  2.                         br.read(ch);
  3.                 }
复制代码
你的while循环里的fr.read();就会读取第一个字符,当执行到下面的时候,br.read(ch);是从第二个字符开始读取的,这就是你为什么写入的b.txt文件中没有a的原因,为什么有一串空白,是因为你设置的数组太大,而且你又给排序了,所以就是这样的输出了
回复 使用道具 举报 1 0
  1. public static void main(String[] args) throws Exception {
  2.                 FileReader fr=new FileReader("d:\\a.txt");
  3.                 BufferedReader br=new BufferedReader(fr);
  4.                                 BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\b.txt"));
  5.                // char[] ch=new char[15];
  6.                                 int i=0;
  7.                 while((i=br.read())!=-1){
  8.                        // br.read(ch);
  9.                                            bw.write(i);
  10.                 }
  11.                 //Arrays.sort(ch);
  12.               //  bw.write(ch, 0, ch.length);
  13.                
  14.                 br.close();
  15.                 bw.close();        
  16.                
  17.         }
复制代码
建议写成这样的,而且,BufferedReader有readLine的方法,一次可以 读取一行

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
月光海 发表于 2014-4-16 18:17
你的while循环里的fr.read();就会读取第一个字符,当执行到下面的时候,br.read(ch);是从第二个字符开始读 ...

如果是这样子的,那么do...while应该就可以了?
回复 使用道具 举报
love~陌 发表于 2014-4-17 14:43
如果是这样子的,那么do...while应该就可以了?

不行,读出来了一个字符就要写进去再去把其他的数据读到数组里,不然数据还是会丢失的
回复 使用道具 举报
如果你非要这样做的话,就改下里面的代码,比如
  1. int i=0;
  2. while((i=fr.read())!=-1){
  3. ch[0]=(char)i;
  4. br.read(ch,1,ch.length-1);
  5.                 }
复制代码
没测试,你可以参考下看看思路
回复 使用道具 举报
当使用BufferedReader和BufferedWriter时要使用读取一行的方法
代码演示:
  1. public class IOTest {

  2.         public static void main(String[] args)throws Exception {
  3.                 // TODO Auto-generated method stub
  4.                
  5.                 BufferedReader bufr = new BufferedReader(new FileReader("e:\\a.txt"));
  6.                 BufferedWriter bufw = new BufferedWriter(new FileWriter("e:\\b.txt"));
  7.                
  8.                 String line = null;
  9.                 while((bufr.readLine())!=null){
  10.                         bufw.write(line);
  11.                         bufw.flush();
  12.                 }
  13.                
  14.                 bufr.close();
  15.                 bufw.close();
  16.         }
  17.        
  18.         public static void copy()throws Exception{
  19.                 FileReader fr = new FileReader("e:\\a.txt");
  20.                 FileWriter fw = new FileWriter("e:\\b.txt");
  21.                
  22.                 char[] chs = new char[15];
  23.                 int ch = 0;
  24.                 while((ch=fr.read(chs))!=-1){
  25.                         fw.write(chs);       
  26.                 }
  27.                 fr.close();
  28.                 fw.close();
  29.         }

  30. }
复制代码
回复 使用道具 举报
月光海 发表于 2014-4-17 15:12
不行,读出来了一个字符就要写进去再去把其他的数据读到数组里,不然数据还是会丢失的 ...

我测试了,貌似可以,
因为损失第一个字符,而do...while是先执行后判断,满足条件
回复 使用道具 举报
我感觉应该和指针有关系!坐等答案
回复 使用道具 举报
兄弟,你的fr.read()已经读了一个字符了啊,所以后面就只有3个字符了,就是abc,
所以这里循环只会执行一次啊
因为br.read(ch)它将通过重复地调用底层流的 read 方法,尝试读取尽可能多的字符
然后你排序了一下,就变成你说的那样子了
回复 使用道具 举报
本帖最后由 追逐 于 2014-4-18 13:12 编辑
  1. public static void main(String[] args) throws Exception {
  2.             FileReader fr=new FileReader("E:\\a.txt");
  3.             BufferedReader br=new BufferedReader(fr);
  4.             BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\b.txt"));
  5.             /*
  6.              * 你写的明明是一个字符流干吗要用字节流的读取方式去读取呢。用字符流的方式不是更方便快捷吗
  7.              * 希望下面的代码对你有所帮助
  8.              * */
  9.             String line = null;
  10.             while((line = br.readLine()) != null){
  11.                    bw.write(line);
  12.                    bw.newLine();
  13.                    bw.flush();
  14.             }
复制代码
回复 使用道具 举报
切记 这个和那个迭代器  判断一次next 或read一次
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马