源码均以JDK1.8作为参考
前言:
InputStream实现了两个接口Closeable和AutoCloseable:
Closeable:JDK1.5中引入,Closeable接口中只有一个close()方法的定义:
public void close() throws IOException;
实现了Closeable接口的类的对象可以被关闭,流类都实现了该接口,以达到关闭流的目的。
AutoCloseable:JDK1.7中引入,为JDK1.7中引入的带资源的try语句提供了支持,try可以自动关闭资源。AutoCloseable接口亦只定义了一个close()方法的定义:
void close() throws Exception;
只有实现了AutoCloseable接口的类的对象才可以使用带资源的try语句进行管理。在JDK1.7中Closeable继承了AutoCloseable接口,所以IO包下的流类都可以使用带资源的try语句进行管理。
源码分析:
InputStream是相对于Java本身来说的,从其他途径向内读取数据,所以叫输入流。InputStream是一个抽象类,是java.io流字节流的基类。
InputStream中定义了一系列方法,
主要方法:
1.public abstract int read():
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
子类必须提供此方法的一个实现。
2.public int read(byte b[]):
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。
3.public int read(byte b[], int off, int len):
将输入流中最多 len 个数据字节读入 byte(从byte数组的off索引开始读入) 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。
注:对于InputStream中的2和3方法,其实现都是依赖1方法来实现的,通过1方法获取单个字节,读入2和3中指定的缓冲数组中。
4. public long skip(long n):
在输入流中跳过指定字节数的读取,跳过的字节数为n,但是InputStream定义了skip的最大长度MAX_SKIP_BUFFER_SIZE=2048,n超过这个值,将只跳过MAX_SKIP_BUFFER_SIZE个字节的读取,源码如下:
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;
}
同样基于read系列重载方法实现,原理就是直接讲指定个数的字节读取,但是不进行保留,以完成skip操作。
5. public int available():
返回该InputStream在不被阻塞的情况下下一次可以读到的数据长度。
6. public void close():
关闭InputStream流
7. public synchronized void mark(int readlimit):
标记InputStream流中的某一个位置,由其子类进行具体实现。
8. public synchronized void reset():
将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
9. public boolean markSupported():
检查此流是否支持具体实现了public synchronized void mark(int readlimit)方法。
总: InputStream在一定程度上对输入流做了一个抽象,定义了输入流的基本职责,但是并不提供具体的实现,只是做简单的约束,并非强制重写,由于InputStream是abstract修饰的,所以其并不具有实例化的能力,要完全借助于其子类实现对于流的各种操作。
版权声明:本文为博主原创文章,未经博主允许不得转载。