Java IO流(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/78245773

上一篇文章中已经介绍完了字符流的两个缓冲区对象——BufferedWriter和BufferedReader,而缓冲区的原理我们并没搞明白,本文就来揭示其正面目了。缓冲区的原理——临时存储数据的方式,减少了对设备操作的频率,提高了效率,其实就是将数据临时缓存到了内存(数组)中。下面我们就来分别模拟BufferReader类的read()方法缓冲区实现和其readLine()方法缓冲区实现。

BufferReader类的read()方法缓冲区实现

有这样一个需求:我们知道BufferReader类中有一个read()方法,现在要自定义一个类中包含一个功能和read()一致的方法,来模拟一下BufferReader。
下面我编写一个我自己的MyBufferedReader类,并在其中实现一个myRead()方法来模拟BufferReader类的read()方法,示例代码如下:

public class MyBufferedReader {

    // 1、持有一个流对象。
    private Reader r;

    // 2、因为是缓冲区对象,所以内部必然维护了一个数组。
    private char[] buffer = new char[1024];

    // 3、定义一个角标。
    private int index = 0;

    // 4、定义变量,记录住数组中元素的个数。
    private int count = 0;

    // 一初始化,就必须明确被缓冲的对象。
    public MyBufferedReader(Reader r) {
        super();
        this.r = r;
    }

    /**
     * 读取一个字符的方法,而且是高效的。
     * @throws IOException 
     */
    public int myRead() throws IOException {
        if (count == 0) {
            // 通过被缓冲的流对象的read方法,就可以将设备上的数据存储到数组中。
            count = r.read(buffer);
            index = 0;
        }

        if (count < 0) {
            return -1;
        }

        char ch = buffer[index];
        index++; // 角标每取一次都要自增。
        count--; // 既然取出一个,数组的数量就要减少,一旦减到0,就从设备上获取一批数据存储到数组中。
        return ch;
    }

}

不理解以上代码没关系,下面我会图解,如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yerenyuan_pku/article/details/78245773