模拟一个带行号的缓冲区对象

来源:互联网 发布:数据强弱关系流程图 编辑:程序博客网 时间:2024/05/21 08:57
/*模拟一个带行号的缓冲区对象(myLineNumberReader):注:LineNumberReader是BufferedReaderd的子类都是装饰类。
 * 实现功能:读一行,将行号连内容都打印,并行号可设置
 * 思路:1.建立自己的装饰类(是Reader体系的装饰类),使用装饰类的写法:构造函数将被装饰类对象传入。在被装饰类已有的功能上扩展功能
 * 2.类比LineNumberReader,这里要在Reader基础上扩展的特有方法是ReadLine()、getLineNumber()、setLineNumber(int num )、close()四个方法
 * */


package demo;
import java.io.*;
class Demo{
public static void main(String [] args)throws IOException
{
FileReader fr=new FileReader("abc.txt");
myLineNumberReader lnr=new myLineNumberReader(fr);
lnr.mySetLineNumber(100);
String line=null;
while((line=lnr.myReadLine())!=null){
System.out.println(lnr.myGetLineNumber()+":"+line);
}
lnr.myclose();
}
}


 class myLineNumberReader 
 {
private Reader r;
private int num;
myLineNumberReader(Reader r){
this.r=r;
}
 
public String myReadLine(){
StringBuilder sb=new StringBuilder();
int ch=0;
try {
while((ch=r.read())!=-1){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
num++;
return sb.toString();
}else{
sb.append((char)ch);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(sb.length()!=0){//最后一行没有\r\n,也就没有判断到\n,但是数据存入了sb,所以要另加判断。
num++;
      return sb.toString();
}
return null;
}
public int myGetLineNumber(){
return this.num;
}
public void mySetLineNumber(int num ){
this.num=num;
}
public void myclose(){
try {
r.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

 }




简写:

package demo;
import java.io.*;
class Demo{
public static void main(String [] args)throws IOException
{
FileReader fr=new FileReader("abc.txt");
myLineNumberReader lnr=new myLineNumberReader(fr);

String line=null;
while((line=lnr.myReadLine())!=null){
System.out.println(lnr.myGetLineNumber()+":"+line);
}
lnr.close();
}
}


 class myLineNumberReader extends BufferedReader
 {
private Reader r;
private int num;
myLineNumberReader(Reader r){
super(r);
}
 
public String myReadLine() throws IOException{
num++;
return super.readLine();
}
public int myGetLineNumber(){
return this.num;
}
public void mySetLineNumber(int num ){
this.num=num;
}

 }

0 0
原创粉丝点击