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晓码阁 版权所有