java类库创建了大量的io类来满足各种io端相互通信的需求。io是以流的输入输出为基础的,屏蔽了各种设备的实现细节。
一、InputStream
InputStream为输入流的基类,它的子类表示了不同数据源的输入流。
- 数据源为字节数组ByteArrayInputStream.可以作为内存缓冲区,从里面读取字节。
- 数据源为String对象的StringBufferInputStream,将字符串转换成输入流。
- 数据源为文件的FIleInputStream.
- "管道"PipedInputStream作为多线程的数据源,一端输入,另一端输出。
- SequenceInputStream将多个输入流合并成一个流。
- 其他数据源,如internet.
在使用InputStream时很少使用单一的流对象,而是使用装饰器输入流FilterInputStream组合多个对象来使用。FilterInputStream类型:
- DataInputStream可以以流的形式读取基本数据类型(int,char,long等)。
- BufferedInputStream代表使用"缓冲区"进行读取。
- LineNumberInputStream跟踪输入流中的行号,使用getLineNumber()和setLineNumber(int numer).
- PusheBackInputStream具有"能弹出一个字节的缓冲区",可以将最后读到的一个字节回退,通常作为编译器的扫描器。
二、OutputStream
OutputStream为输出流的基类,它的子类表示了不同数据源的输出流,输出流决定了输出的目标:字节数组、文件、管道。
- ByteArrayOutputStream为要输出的"流"的数据在内存中创建缓冲区。
- FileOutputStream文件输出流。
- PipedInputStream管道输出流。
而OutputStream一般也使用FilterOutputStream来组合多个对象提供输出功能。FilterInputStream类型:
- DataOutputStream与DataInputStream对应,想输出流中写入基本数据类型。
- PrintStream格式化输出。
- BufferedOutputStream表示使用"缓冲区"输出数据,可以用flush()清空缓冲区。可以指定缓冲区大小。
三、Reader和Writer
Reader和Writer提供了字符的输入和输出功能,InputStreamReader可以把InputStream转换为Reader,OutputStreamWriter可以把OutputStream转换为Writer。他们之间的具体转换如下:
InputStream | Reader,适配器:InputStreamReader |
OutputStream | Writer,适配器:OutputStreamWriter |
FileInputStream | FileReader |
FileOutputStream | FileWriter |
StringBufferInputStream | StringReader |
无对应 | StringWriter |
ByteArrayInputStream | CharArrayReader |
ByteArrayOutputStream | CharArrayWriter |
PiedInputStream | PiedReader |
PiedOutputStream | PiedWriter |
四、RandomAccessFile
RandomAccessFile不是InputStream或OutputStream的继承,而是一个独立的文件读写类,适用于大小已知的记录组成的文件,可以用seek()方法将记录从一处转到另一处。同时它支持搜索方法,并且只适用于文件。1.4后它的大部分功能由nio存储映射文件替代
五、nio
nio使用缓冲器ByteBuffer在通道之间传输数据,i/o中有三个类可以产生FileChannal,分别是FileInputStream,FileOutputStream和RandomAccessFile.可以向通道传递用于读写的ByteBuffer.