流按作用分类可分为节点流和处理流。节点流是用来指定输入来源或者输出去向的流。处理流是用来叠加在节点流上对数据进一步处理的流。
InputStream派生出的节点流包括:FileInputStream(从文件读取)、PipedInputStream、ByteArrayInputStream(从字节数组读取)、
StringBufferInputStream(从StringBuffer读取)。
InputStream派生出的处理流包括:FilterInputStream、SequenceInputStream、ObjectInputStream(以对象形式读取数据)。其中FilterInputStream又派生出LineNumberInputStream、DataInputStream、BufferedInputStream、PushbackInputStream。
OutputStream派生出的节点流包括:FileOutputStream(写出到文件)、PipedOutputStream、ByteArrayOutputStream(写出到字节数组)。
OutputStream派生出的处理流包括:FilterOutputStream、ObjectOutputStream(以对象的形式写出)。FilterOutputStream又派生出DataOutputStream(以基本数据的形式写出)、BufferedOutputStream(缓存后定量写出)、PrintStream(以打印形式写出)。
InputStream
InputStream方法列举:
read():
public abstract int read() throws IOException;
InputStream中的read()读取单个字节是抽象方法。返回读取到的字节,范围是0到255,如果读取到了流的末尾,则会返回-1。如果没有输入数据该方法会阻塞住。
read(byte b[]):
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
读取一些字节到字节数组b中,返回实际读取的字节数,如果字节数组b长度为0,则没有读取到任何字节,返回0。如果读取到了流的末尾,则会返回-1。注意,读取的字节按顺序放到数组b中,如果实际读取到的字节数小于b的长度,则b中剩下的位置的元素值保持不变。
read(byte b[], int off, int len):
public int read(byte b[], int off, int len) throws IOException
len表示所要读取的字节数,off表示从b[off]开始存放读取到的字节。实际实现是重复调用read()方法,如果首次调用read()抛出异常,则会直接不处理从本方法中抛出异常。后续调用read()如果抛出异常则会捕获住异常。
skip(long n):
public long skip(long n) throws IOException
跳过n个字节,实际实现是通过read()把n个字节读取到局部变量字节数组中。
FileInputStream和FileOutputStream
文件字节输入流和输出流分别提供read()、write()和read(byte[])、write(byte[],int,int)两组无参和有字节数组参数的读写方法。如果是无参的读写方法,效率十分低。根据测试,使用字节数组的读写比无参读写快上700+倍。
如果再套上一层BufferedInputStream和BufferedOutputStream,速度可以提升到原来的3.5倍左右。