IO操作中缓冲区原理

一、缓冲区原理

原理:临时存储数据的方法,减少对设备操作的频率,提高了效率,其实就是将数据临时存储到了内存(数组)中。
图解:



二、模拟一个BufferedReader

根据缓冲区原理图解,试着实现自己的BufferedReader
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;
	    }
	    
	    /**
	     *读取一个字符,而且是高效的。
	     */
	    public int myRead() throws IOException {
		//通过被缓冲流对象的read方法,就可以将设备上的数组存储到数组中。
		if(count == 0){
		    count = r.read(buffer);
		    index = 0
		}
		if(count<0){
		    return -1;
		}
		char ch = buffer[index];
		index++;//每取一次,角标要自增
		count--;//取出一个,数组的数量要减少,一旦减到0,就再从设备上获取一批数据存储到数组中。

		return ch;
	    }

	    /**
	     *读取一行文本
	     */
	    public String myReadLine() throws IOException{
		//1,定义临时缓冲区,用于存储一行文本
		StringBuilder sb = new StringBuilder();
		//2,不断调用myRead方法从缓冲区中取出数据
		int ch = 0;
		while((ch=myRead())!=-1){
		    //在存储前要判断行终止符
		    if(ch=='\r')
		        continue;
		    if(ch=='\n')
			return sb.toString();

		    //将读到的字符进行临时存储
		    sb.append((char)ch);
		}
		//如果文本结尾处有数据,但没有行终止符,数据已被读到,并存储到StringBuilder中,只要判断StringBuilder的长度即可。
		if(sb.length!=0){
		    return sb.toString();
		}
		return null;
	    }

	    /**
	     *定义一个缓冲区的关闭方法
	     */
	    public void myClose() throws IOException {
		//其实就是关闭被缓冲区的流对象
		r.close();
	    }
	}

测试类
	public static void main(String[] args) throws IOException{
	    FileReader fr = new FileReader("tempfile\\bufw.txt");
	    MyBufferedReader myBufr = new MyBufferedReader(fr);
	    String line = null;
	    whlie(line=myBufr.myRead()!=null){
		System.out.println(line);
	    }
	    myBufr.myClose();
	}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值