IO:即输入与输出。I/O是所有程序都必需的部分,虽然我们看不到它明显的运行效果。输入机制允许程序读取外部数据(例如磁盘、光盘以及其他存储设备的数据)以及用户输入数据;输出机制允许程序记录运行状态,将程序数据输出到磁盘、光盘等存储设备中。
I/O大致包括以下类别:
- 磁盘操作:File
- 字节操作:InputStream 和 OutputStream
- 字符操作:Reader 和 Writer
- 对象操作:Serializable
- 网络操作:Socket
- 新的输入/输出:NIO
Java程序中,对于数据的I/O操作以“流(stream)”的方式进行。
流的分类 1. 按数据的流向分为:输入流,输出流- 输入流: 把数据从外部存储设备读取到内存的流
- 输出流: 把数据从内存写出到外部存储设备的流
- 字节流(8 bit):以字节为单位读写数据的流
- 字符流(16 bit):以字符(java中字符是Unicode编码,一个字符占2 bytes)为单位读写数据的流
| 抽象基类 | 字节流 | 字符流 |
|---|---|---|
| 输入流 | InputStream | Reader |
| 输出流 | OutputStream | Writer |
Java的IO流共涉及40多个类,都是从以上4个抽象基类派生的,并且由这四个类派生出来的子类名称都是以其父类名作为子类名后缀,所以其实他们是非常规则的。
3. 按流的角色分为:节点流,处理流- 节点流:可以直接操作目标设备读取数写数据(即从或向一个特定的节点读写数据,例如FileReader)
- 处理流 : 通过一个间接流类调用已存在的流类来实现数据读写(即对一个已存在的流的连接和封装,例如BufferedReade)。
处理流的构造方法总是要带一个其它流对象做参数。一个流对象经过多次包装,称为流的链接。
上表来自《疯狂Java讲义》
节点流
处理流:
Java I/O 使用了装饰者模式。以 InputStream 为例,
- InputStream 是一个抽象类,表示字节输入流的所有类的超类,作为装饰者模式中的抽象组件。
- FileInputStream 是 InputStream 的子类,属于具体组件,提供字节流的输入操作。
- FilterInputStream 也是 InputStream 的子类但同时与组件是聚合关系,它属于抽象装饰者,用于装饰组件,为组件提供额外的功能。
- 具体装饰者: FilterInputStream的具体实现子类,例如 BufferedInputStream, 为 FileInputStream 提供缓存的功能。
实例化一个具有缓存功能的字节流对象时,只需要将 FileInputStream 对象传入 BufferedInputStream 进行创建就能达到目的。
FileInputStream fileInputStream = new FileInputStream(filePath);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);



