FileReader fr = new FileReader("d:\\buf.txt");
LineNumberReader lnr = new LineNumberReader(fr);
//LineNumberReader是BufferedReader的子類
//此類定義了方法 setLineNumber(int) 和 getLineNumber(),它們可分別用於設置和獲取當前行號。
String line = null;
//lnr.setLineNumber(100);
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();
}
Test:
/*
自定義字符輸入流的包裝類,通過這個包裝類對底層字符輸入流進行包裝,
讓程序通過這個包裝類讀取某個文本文件(例如,一個java源文件)時,
能夠在讀取的每行前面都加上有行號和冒號。
思路:創建一個類,並且創建相應的方法
通過創建一個StringBuilder來作爲緩衝區
添加一個計數器來輸出linenumber
*/
class MyLineNumberReader
{
private Reader r;//定義讀取流
int lineNum=0;//定義行號
MyLineNumberReader( Reader r )//構造方法,初始化就有流和行號兩個屬性
{
this.r=r;
lineNum=0;
}
public String readLine() throws Exception
{
StringBuffer sb=new StringBuffer();//使用緩衝區,臨時存儲讀取的字符
int ch=0;//爲什麼要定義成int型,因爲read方法返回的是字符,可以用ASCII碼錶示,所以用int型接收
while( (ch=r.read())!=-1 )
{
if( ch=='\r')
continue;
else if( ch=='\n')
{
lineNum++;
//定義一個方法addLineNum,遇到換行直接就返回 行號+字符串
return addLineNum( sb.toString() );
}
else
{
sb.append((char)ch);
}
}
//這裏的if判斷的目的是什麼?
if( sb.length()>0 )//這裏應該是length()屬性不是length方法
{ //如果緩衝區的長度!= 0就 返回緩衝區中的字符串
return sb.toString();
}
return null;
}
public String addLineNum( String s )
{
return lineNum+": "+s;
}
public void close() throws Exception//爲什麼關閉流還要搞個方法?
{
r.close();
}
}
class Demo
{
public static void main(String args[]) throws Exception
{
MyLineNumberReader my=new MyLineNumberReader( new FileReader("upLoadTxt.java"));
String s=null;
while( (s=my.readLine())!=null )
{
System.out.println( s );
}
}
}
IO流_LineNumberReader
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.