黑马程序员技术交流社区

标题: IO问题 <已解决> [打印本页]

作者: 田林    时间: 2012-5-17 18:32
标题: IO问题 <已解决>
本帖最后由 田林 于 2012-5-18 10:05 编辑

import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class LineNumberReaderTest {
        
        public static void main(String[] args) throws IOException {
               
                FileReader fr=new FileReader("BufCopyText.java");
               
                LineNumberReader lnr=new LineNumberReader(fr);
               
                lnr.setLineNumber(10);
               
                //打印代码的第一种方式:
                String line=null;
                while((line=lnr.readLine())!=null){
                    
                        System.out.println(lnr.getLineNumber()+""+line);
                }
               
                System.out.println("--------------------------------------------------------");
               
                //打印代码的第二种方式:
                char[] buf=new char[1024];
                int num=0;
                while((num=lnr.read(buf))!=-1){
                        System.out.println(new String(buf,0,num));
                }
               
                lnr.close();
                fr.close();
               
        }

}
两种打印方式单独使用时都可以。但当同时使用时,为什么只有第一种有输出结果?如果我想让两种同时打印出结果,该怎么修改代码???你们测试时,注意上面的“BufCopyText.java”文件,你们可以找个文件替代一下。
作者: 信义明    时间: 2012-5-17 19:05
程序代码应该这样:
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class LineNumberReaderTest {
        
        public static void main(String[] args) throws IOException {
               
                FileReader fr=new FileReader("BufCopyText.java");
               
                LineNumberReader lnr=new LineNumberReader(fr);
               
                lnr.setLineNumber(10);
               
                //打印代码的第一种方式:
                String line=null;
                while((line=lnr.readLine())!=null){
                    
                        System.out.println(lnr.getLineNumber()+""+line);
                }
               
                System.out.println

("--------------------------------------------------------");
               
                //打印代码的第二种方式:
                FileReader fr1=new FileReader("BufCopyText.java");//在这里再定义一次新的文件读取流
                  LineNumberReader lnr1=new LineNumberReader(fr1);//同上
                lnr1.setLineNumber(10);
                char[] buf=new char[1024];
                int num=0;
                while((num=lnr1.read(buf))!=-1){
                        System.out.println(new String(buf,0,num));
                }
               
                lnr.close();
                lnr1.close();
                fr.close();
                fr1.close();
               
        }

}
两种打印方式不能共用一条读取流
作者: 李哲    时间: 2012-5-17 20:09
我认为,既然你已经将数据读入到流中,再次读取,是从上次的尾部开始读,自然什么也读不到。所以第二次打印就打印不出。
然后我查看LineNumberReader的api,发现有mark()方法可以标记该流中的当前位置,然后再用rest()方法重新将流定位到此点,还将相应地重新设置行号。
所以,可以在第一次打印之前mark()方法,打印完后,再rest()方法。
之后进行第二次打印就不成问题。
只是我不明白的是,即使不用mark(),reset()方法,禁用第一次打印的代码,第二次打印仍然打印不出行号。
为什么第二次打印打印不出行号?请指教。
代码如下
  1. public class LineNumberReaderTest {
  2.    
  3.     public static void main(String[] args) throws IOException {
  4.            
  5.             FileReader fr=new FileReader("BufCopyText.java");           
  6.             LineNumberReader lnr=new LineNumberReader(fr);
  7.             
  8.            
  9.             lnr.mark(1024);//标记该流中的当前位置。
  10.             
  11.             
  12.             //打印代码的第一种方式:
  13.             lnr.setLineNumber(10);           
  14.             String line=null;
  15.             while((line=lnr.readLine())!=null){
  16.                
  17.                     System.out.println(lnr.getLineNumber()+""+line);
  18.             }
  19.             
  20.            
  21.             System.out.println("-------------------------------");           
  22.             lnr.reset();//重新将流定位到之前标记的位置。

  23.            
  24.             //打印代码的第二种方式:
  25.             lnr.setLineNumber(10);
  26.             char[] buf=new char[1024];
  27.             int num=0;
  28.             while((num=lnr.read(buf))!=-1){
  29.                     System.out.println(new String(buf,0,num));
  30.             }
  31.            
  32.             lnr.close();
  33.             fr.close();
  34.            
  35.     }

  36. }
复制代码

作者: 田林    时间: 2012-5-18 08:40
李哲 发表于 2012-5-17 20:09
我认为,既然你已经将数据读入到流中,再次读取,是从上次的尾部开始读,自然什么也读不到。所以第二次打印 ...

因为第二次不是按行号读的,所以我没加行号的代码。你将一次读的范围变小,再加上行号代码就可以了。问题已解决,不胜感激!
作者: 李哲    时间: 2012-5-18 08:47
本帖最后由 李哲 于 2012-5-18 08:49 编辑
田林 发表于 2012-5-18 08:40
因为第二次不是按行号读的,所以我没加行号的代码。你将一次读的范围变小,再加上行号代码就可以了。问题 ...

能解决你的问题,我也很高兴。
但是第二次我设置行号,但是依然打印不出行号。为什么?

作者: 田林    时间: 2012-5-18 09:00
1.第二次输出代码中没加:lnr.getLineNumber()
2.一次输出的内容太多!只在开始出打印了一次行号,下面一次读完了。所以也就没有行号。
应该是这两种情况吧!




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