这个系列将了解Java输入流家族中的每一个类,结合示例分析类的使用场景,结合源码学习方法的实现原理。
首先了解的是所有输入流的共同祖先java.io.InputStream,它是一个抽象类,它的方法有
abstract int read()
int read(byte b[])
int read(byte b[], int off, int len)
long skip(long n)
int available()
void close()
void mark(int readlimit)
void reset()
boolean markSupported()
abstract int read()将读入一个字节,并返回读入的字节,或者在遇到输入源结尾时返回-1。在设计具体的输入流类的时候必须覆盖这个方法以提供适用的功能。
InputStream类的其他非抽象方法,需要调用抽象的read方法,因此,各个子类都只需要覆盖这一个方法。
read是阻塞式的,它执行时将阻塞,直至读取到一个字节或者遇到输入源尾部时才返回。
当完成对输入流的读取时,应该通过调用close方法来关闭它,这个调用会释放掉十分有限的操作系统资源。InputStream实现了java.io.Closeable接口,而java.io.Closeable接口又继承了java.lang.AutoCloseable接口,所以所有输入流的操作都可以使用try-with-resource语句。
java内置的InputStream类的直接子类有
- javax.sound.sampled.AudioInputStream
- java.io.ByteArrayInputStream
- java.io.FileInputStream
- java.io.PipedInputStream
- java.io.FilterInputStream
- java.io.SequenceInputStream
- java.io.StringBufferInputStream
- java.io.ObjectInputStream
后面的章节将详细介绍上述的每一个输入流类。