- java io 分类:
- java.io包中的是阻塞型IO;java.nio(new io)中的是非阻塞型IO。java.io采取等待数据的方式工作。new io 采用了observer模式:观察者检测IO端口,如果有数据进来就通知相应的应用程序。
- 按输入方向分,java分输入流和输出流,方向的参照是程序。
- 按处理数据单位的不同,分字节流和字符流。字节流读取的最小单位是一个字节(8bit),字符流读取的最小单位是一个字符(16bit)。
- 按功能的不同,分节点流和处理流。节点流是直接读写数据的流(直接和数据源打交道的流);处理流是对节点流封装的基础上的一种流(和“流”打交道的流),比方FileinputStream是一个节点流,它像一根吸管一样“插进”数据源里“吸取”数据,而BufferedInputStream则是处理流,它像一个桶一样接在“吸管”的另一头”接“(处理)字符。
- 其他常常听到的流有:对象流、缓冲流、压缩流、文件流等,其实都是节点流和处理流的分类。你也可以创建你自己的流。
java.io包中的最基础的类就是一下四个:
字节流 | 字符流 | |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
缓冲区 | 默认没有用到缓冲区,流中的的数据直接到达终点。 | Writer用到缓冲区,比如要把数据写入硬盘时,当流没有被关闭的时候而且没有调用flush( )方法时,数据不会被写入硬盘,除非缓冲区满溢了。 |
以上四个类都是直接从java.lang.Object继承来的,而且他们都是抽象类。比如InputStream的定义是这样写的:public abstract class InputStream extends Object implements Closeable。所以它们需要对应的子类为它们的所有抽象方法提供实现。
java io的(部分类)组织(java.io包):
图 1:部分组织图
图 2: Writer和Reader的组织图
为了在适当的时候能把这两种流类联系起来,API中设置了两个类,充当二者的桥梁。它们分别是InputStreamReader和OutputStreamWriter。 InputStreamReader将输入的字节流转换为字符流;而OutPutStreamWriter将输出的字符转换流为字节流。
图3: InputStreamReader和OutputStreamWriter的示意图,小段代表Stream(注意方向,相同大小的端对上才能正确的把两个流对接上)
参考资料: