//表示所有字节输入流实现类的基类。它的作用就是抽象地表示所有从不同数据源产生输入的类
public abstract class InputStream implements Closeable {
private static final int MAX_SKIP_BUFFER_SIZE = 2048;
// 从输入流中读取数据的下一个字节,以int返回
public abstract int read() throws IOException;
// 从输入流中读取数据的一定数量字节,并存储在缓存数组b
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
// 从输入流中读取数据最多len个字节,并存储在缓存数组b
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;//返回读取的字节数
}
// 从输入流中跳过并丢弃 n 个字节的数据
public long skip(long n) throws IOException {
long remaining = n;
int nr;
if (n <= 0) {
return 0;
}
int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
byte[] skipBuffer = new byte[size];
while (remaining > 0) {
nr = read(skipBuffer, 0, (int)Math.min(size, remaining));
if (nr < 0) {
break;
}
remaining -= nr;
}
return n - remaining;//实际跳过的字节数
}
// 返回下一个方法调用能不受阻塞地从此读取(或者跳过)的估计字节数
public int available() throws IOException {
return 0;
}
// 关闭此输入流,并释放与其关联的所有资源
public void close() throws IOException {}
// 在此输出流中标记当前位置
public synchronized void mark(int readlimit) {}
// 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置
public synchronized void reset() throws IOException {
throw new IOException("mark/reset not supported");
}
// 测试此输入流是否支持 mark 和 reset 方法
public boolean markSupported() {
return false;
}
}
InputStream 源码阅读
最新推荐文章于 2022-07-15 15:03:29 发布