模拟字节流缓冲区实现原理

package demo.io;

import java.io.*;

class MyBufferedInputStream {
    private InputStream in;
    private byte[] buf = new byte[1024];
    private int pos = 0, count = 0;//pos: 位置指针    count: 当前buf中未读数据数量

    MyBufferedInputStream(InputStream in) {
        this.in = in;
    }

    int myRead() throws IOException {
        if (count == 0) {//如果缓冲区buf中无数据
            count = in.read(buf);
            if (count < 0)//如果读取完
                return -1;
            pos = 0;
            byte b = buf[pos];
            count--;
            pos++;
            return b & 0Xff;
//byte -> int   1字节 -> 4字节  类型提升,前面补0,需要&255  详情:  黑马程序员_毕向东_Java基础视频教程第19天-14-IO流(自定义字节流的缓冲区-read和write的特点).avi
        } else {//当buf中有数据,就一个一个取呗
            byte b = buf[pos];
            count--;
            pos++;
            return b & 255;
        }
    }

    void myClose() throws IOException {
        in.close();
    }
}

class 模拟字节流缓冲区 {
    public static void main(String[] args) {
        MyBufferedInputStream bufis = null;
        BufferedOutputStream bufos = null;
        try {
            bufis = new MyBufferedInputStream(new FileInputStream("新建位图图像.bmp"));
            bufos = new BufferedOutputStream(new FileOutputStream("I:\\bb.bmp"));
            int ch = 0;
            while ((ch = bufis.myRead()) != -1) {
                bufos.write(ch);//此时write强转被提升为int 的 byte -1 为  byte -1
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufis != null)
                    bufis.myClose();
                if (bufos != null)
                    bufos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//read 提升,write 强转

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值