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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田林 中级黑马   /  2012-5-17 18:32  /  1649 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田林 于 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”文件,你们可以找个文件替代一下。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
程序代码应该这样:
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();
               
        }

}
两种打印方式不能共用一条读取流

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我认为,既然你已经将数据读入到流中,再次读取,是从上次的尾部开始读,自然什么也读不到。所以第二次打印就打印不出。
然后我查看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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
李哲 发表于 2012-5-17 20:09
我认为,既然你已经将数据读入到流中,再次读取,是从上次的尾部开始读,自然什么也读不到。所以第二次打印 ...

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

能解决你的问题,我也很高兴。
但是第二次我设置行号,但是依然打印不出行号。为什么?
回复 使用道具 举报
1.第二次输出代码中没加:lnr.getLineNumber()
2.一次输出的内容太多!只在开始出打印了一次行号,下面一次读完了。所以也就没有行号。
应该是这两种情况吧!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马