博客信息

IO流之字符流缓冲区(自定义MyBufferedReader、装饰模式在IO流中的应用、LineNumberReader)

发布时间:『 2019-06-11 05:08』  博客类别:java基础  阅读(670)


自定义MyBufferedReader

readLine方法的原理

小李飞刀_IO流


自定义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流中的应用

装饰者设计模式

 

当想要对已有的对象进行功能增强时;

可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类;

 

装饰类通常会通过构造方法接收被装饰的对象;

并基于被装饰的对象的功能,提供更强的功能;


小李飞刀_IO流


小李飞刀_IO流

IO流的前世今生

小李飞刀_IO流


小李飞刀_IO流


完善自定义的装饰类

装饰类和被装饰类继承于同一个父类,需要重写父类的抽象方法

小李飞刀_IO流



LineNumberReader


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();
    }
}






关键字:     Java基础       IO流       缓冲流  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有