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 强转
11-07
8698