I/O流

来源:互联网 发布:云计算的优缺点 编辑:程序博客网 时间:2024/05/17 23:37

这里写图片描述
这里写图片描述

流按作用分类可分为节点流和处理流。节点流是用来指定输入来源或者输出去向的流。处理流是用来叠加在节点流上对数据进一步处理的流。

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倍左右。

原创粉丝点击