readLine方法的原理
自定义MyBufferedReader类
明白了Bufferedreader类中的特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法,
来模拟一下Bufferedreader
package com.javaxl.io.buffer; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-06-11 15:56 */ public class Demo1 { public static void main(String[] args) throws IOException { MyBufferedReader mbr = new MyBufferedReader(new FileReader("c:\\Demo1_copy.java")); String str = null; while((str = mbr.readLine())!=null){ System.out.println(str); } mbr.close(); } } class MyBufferedReader{ private Reader reader; MyBufferedReader(Reader reader){ this.reader = reader; } /** * 可以一次读一行数据的方法 * @return * @throws IOException */ public String readLine() throws IOException { // 定义一个临时容器,源bufferedreader封装的是字符数组; // 为了演示方便,定义一个StringBuffer容器,因为最终还是要将数据变成字符串 StringBuffer sb = new StringBuffer(); int ch = 0; while((ch=reader.read())!=-1){ if(ch == '\r'){ continue; }else if(ch == '\n'){ return sb.toString(); }else { sb.append((char)ch); } } // 读到最后一行字符,最后一行字符没有换行的情况下,需要将缓冲区中的残留的数据也返回 if(sb.length() > 0){ return sb.toString(); } return null; } public void close() throws IOException { reader.close(); } }
装饰者设计模式
当想要对已有的对象进行功能增强时;
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类;
装饰类通常会通过构造方法接收被装饰的对象;
并基于被装饰的对象的功能,提供更强的功能;
IO流的前世今生
完善自定义的装饰类
装饰类和被装饰类继承于同一个父类,需要重写父类的抽象方法
package com.javaxl.io.buffer; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-06-11 16:31 */ public class LineNumberReaderDemo { public static void main(String[] args) throws IOException { LineNumberReader br = new LineNumberReader(new FileReader("c:\\Demo1_copy.java")); String str = null; while((str = br.readLine())!=null){ System.out.println(br.getLineNumber()+":"+str); } br.close(); } }
模拟一个带行号的缓冲区对象
package com.javaxl.io.buffer; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-06-11 16:31 */ public class MyLineNumberReaderDemo { public static void main(String[] args) throws IOException { MyLineNumberReader br = new MyLineNumberReader(new FileReader("c:\\Demo1_copy.java")); String str = null; while((str = br.readLine())!=null){ System.out.println(br.getLineNumber()+":"+str); } br.close(); } } class MyLineNumberReader{ private Reader reader; private long lineNumber = 0; public long getLineNumber() { return lineNumber; } public void setLineNumber(long lineNumber) { this.lineNumber = lineNumber; } MyLineNumberReader(Reader reader){ this.reader = reader; } /** * 可以一次读一行数据的方法 * @return * @throws IOException */ public String readLine() throws IOException { // 定义一个临时容器,源bufferedreader封装的是字符数组; // 为了演示方便,定义一个StringBuffer容器,因为最终还是要将数据变成字符串 StringBuffer sb = new StringBuffer(); lineNumber++; int ch = 0; while((ch=reader.read())!=-1){ if(ch == '\r'){ continue; }else if(ch == '\n'){ return sb.toString(); }else { sb.append((char)ch); } } // 读到最后一行字符,最后一行字符没有换行的情况下,需要将缓冲区中的残留的数据也返回 if(sb.length() > 0){ return sb.toString(); } return null; } public void close() throws IOException { reader.close(); } }
优化后(因为继承同一个父类)
package com.javaxl.io.buffer; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-06-11 16:31 */ public class MyLineNumberReaderDemo { public static void main(String[] args) throws IOException { MyLineNumberReader br = new MyLineNumberReader(new FileReader("c:\\Demo1_copy.java")); String str = null; while((str = br.readLine())!=null){ System.out.println(br.getLineNumber()+":"+str); } br.close(); } } class MyLineNumberReader extends MyBufferedReader{ private long lineNumber = 0; public long getLineNumber() { return lineNumber; } public void setLineNumber(long lineNumber) { this.lineNumber = lineNumber; } MyLineNumberReader(Reader reader){ super(reader); } /** * 可以一次读一行数据的方法 * @return * @throws IOException */ public String readLine() throws IOException { // 定义一个临时容器,源bufferedreader封装的是字符数组; // 为了演示方便,定义一个StringBuffer容器,因为最终还是要将数据变成字符串 lineNumber++; return super.readLine(); } public void close() throws IOException { super.close(); } }
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有