我也想了个自定义字节流
import java.io.IOException;
import java.io.InputStream;
/*
* 内部提供了一个缓冲区
* 当第一次调用read()方法时, 该类从被包装的流中读取一批字节装入缓冲区, 返回1个
* 以后再调用read()方法时, 就不从文件中读取了, 直接从缓冲区中返回
* 直到缓冲区中数据都被读取过之后, 才再次读取文件
*/
public class MyBufferedInputStream extends InputStream {
private InputStream in; // 引用被包装的对象
private byte[] buffer = new byte[8192]; // 缓冲区
private int pos; // 该返回缓冲区中的哪个索引
private int len; // 缓冲区中有效数据的个数
public MyBufferedInputStream(InputStream in) { // 通过构造函数, 接收被包装的对象
this.in = in;
}
public int read() throws IOException{
if (pos == len) { // 第一次调用时pos和len都等于0, 所有数据都读取过时pos和len都等于数组中有效数据的个数
len = in.read(buffer); // 使用被包装的流读取数据到缓冲区, 记住个数
pos = 0; // pos归0, 从第一个开始返回
}
return len == -1 ? -1 : buffer[pos++] & 255; // 如果遇到文件末尾, 就返回-1, 如果没遇到文件末尾, 从缓冲区中返回数据
}
public void close() throws IOException{
in.close(); // 关闭被包装的流
System.out.println("close in");
}
} |