JAVA IO源码学习系列一(InputStream)
## 1.字节输入流源码InputStream介绍##
InpuSteam是字节输入流操作的超类(抽象类),定义了基本的一些操作方法,流的操作大概四部分:(1)构造数据流(来源);(2)读取流;(3)读取流则需要判断是否可读;(4):操作结束要记得关闭;所以主要关注的方法:构造函数(构造数据),available()判断当前数据是否还能继续读取,read()读取数据,close()结束之后一定关闭相关资源;下面是具体的源码:
public abstract class InputStream implements Closeable {
//默认可以跳过的最大范围
private static final int MAX_SKIP_BUFFER_SIZE = 2048;
//读取字节流(子类具体实现)
public abstract int read() throws IOException;
//将字节流写入具体的字节数组b[]
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
//将字节流写入具体的字节数组b[],从指定的位置读off,和读具体的大小len
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;
}
InputSteam主要抽象了一般的方法,具体实现通过不同的子类,在此就不多做介绍;
神兽出发:
/**
* ┌─┐ ┌─┐ + +
* ┌──┘ ┴───────┘ ┴──┐++
* │ │
* │ ─── │++ + + +
* ███████───███████ │+
* │ │+
* │ ─┴─ │
* │ │
* └───┐ ┌───┘
* │ │
* │ │ + +
* │ │
* │ └──────────────┐
* │ │
* │ ├─┐
* │ ┌─┘
* │ │
* └─┐ ┐ ┌───────┬──┐ ┌──┘ + + + +
* │ ─┤ ─┤ │ ─┤ ─┤
* └──┴──┘ └──┴──┘ + + + +
* 神兽保佑
* 代码无BUG!
*/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。