其中IO流是最经典的装饰器模式的使用
利用装饰器模式自己实现读取文本
public class MyBufferReader extends Reader{
private Reader in;
public MyBufferReader(Reader reader) {
this.in = reader;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return 0;
}
@Override
public void close() throws IOException {
in.close();
}
public String readWithLine() throws Exception{
StringBuilder sb = new StringBuilder();
int i;
while(true){
i = in.read();
if(i == '
'){
continue;
}
if(i == '
' || i == -1){
break;
}
sb.append((char)i);
}
if(sb.toString().length() == 0){
if(i == '
'){
return "";
}else{
return null;
}
}
// return (count ++) + "_" + sb.toString();
return sb.toString();
}
public static void main(String[] args) throws Exception {
//这是重写的方法
Reader reader = new FileReader("D:/1.txt");
MyBufferReader br = new MyBufferReader(reader);
String line;
while((line = br.readWithLine()) != null){
System.out.println(line);
}
br.close();
//这是原生的方法
// Reader reader = new FileReader("D:/1.txt");
// BufferedReader br = new BufferedReader(reader);
// String line;
// while((line = br.readLine()) != null){
// System.out.println(line);
// }
// br.close();
}
}
利用装饰器模式自己实现读取文本(带行号)
原生行号的类是LineNumberReader
public class MyLineNumberReader extends MyBufferReader{
private int lineNumber;
public MyLineNumberReader(Reader reader) {
super(reader);
}
public int getLineNumber() {
return lineNumber;
}
@Override
public String readWithLine() throws Exception {
String line = super.readWithLine();
if(null != line){
lineNumber ++;
}
return line;
}
public static void main(String[] args) throws Exception {
//这是重写的方法
Reader reader = new FileReader("D:/1.txt");
MyLineNumberReader br = new MyLineNumberReader(reader);
String line;
while((line = br.readWithLine()) != null){
System.out.println(br.getLineNumber() + ":" + line);
}
br.close();
}
}