Java的I/O流的概念模型:
Java I/O流共涉及40多个类,由4个抽象基类(InputStream/OutputStream Writer/Reader)派生出:
InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。
对于InputStream/Reader而言,他们把输入设备抽象成一个“水管”,这个“水管”里的每一个“水滴”就是一个输入流,依次排列。如下图所示:
字节流和字符流的处理方式其实非常相似,只是他们处理的输入/输出单位不同而已。输入流使用隐式的记录指针来表示当前正准备从哪个“水滴”开始读取,每当程序从InputStream或Reader里读取一个或者多个“水滴”后,记录指针自动向后移动;除此之外,InputStream和Reader里都提供一些方法来控制记录指针的移动(如:reset()将此流的记录指针重新定位到上一次记录标记(mark())的位置;skip()记录指针向前移动n个字节、字符等)。
对于OutputStream/Writer而言,他们同样把输入输出设备抽象成“水管”,只是这个水管里面没有任何水滴,如下图所示:
正如图所示,当执行输出时,程序相当于一次把”水滴“放入到水管中,输出流同样采用隐式指针来标识当前水滴即将放入的位置,每当程序向OutputStream/Writer里输出一个或者多个水滴之后,记录将自动向后移动。
值得注意的是Java的I/O流是处理流而不是节点流,Java I/O采用处理流而不是节点流的原因:
1)、主要以增加缓冲的方式来提高输入输出效率,从而提升性能
2)、处理流可能提供一系列便捷的方法来一次输入/输出大批量的内容,而不是输入/输出一个或者多个”水滴“