为什么需要I/0流
- 当我们的程序需要从
硬盘,网络,或其他应用程序
中读取或写入数据时候,数据传输量可能很大,而我们的内存或带宽有限
,无法一次性读取获取写入大量数据。 - 而流(Stream)可以实现一点一点的逐步传输数据。
- 想想我们是怎样下载一个大文件的, 下载软件(例如x雷)并不会占用你内存很大的空间, 而只是在内存划分一个缓冲区, 一点一点地下载到自己的内存(缓冲区满了再写到硬盘),。
Stream
- Stream是一个java类,这个类用于java程序和外部设备之前的输入输出操作。
- 所谓外部设备可以是硬盘上的文件,也可以是网络设备,或其他java程序。
- 在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。通过流的形式允许java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收的(sink)的有序数据。
- 如下图,输入输出流就像连接程序和水缸的管道,让水流一点点通行。
I/O流的分类
- I/O流具体的分类
- 从流的方向划分:分为
输入流
,输出流
- 从流的传输单位划分: 分为
字节流
(8位字节),字符流
(16位的字符) - 从流的角色划分: 分为
节点流
,处理流
- 节点流是直接连接
数据源
的流,可以直接向数据源(特定的IO设备,如硬盘,网络,其他程序)读写数据
。 - 处理流通过
构造方法接收一个节点流
,对节点流使用装饰者模式
增加更多的功能,处理流必须依赖于一个节点流
,因为只有节点流最终可以将数据流输入输出到IO设备中。
- 节点流是直接连接
- 从流的方向划分:分为
- Java将所有传统的流类型都放在Java.io包下,用于实现输入和输出功能。
- 该包下的流的类非常多,初学者非常容易混淆,但我们始终记住,java的I/0存在4大基类,而所有的IO流实现类,都是其子类。
I/O流架构体系
这个缺少一个继承自Writer基类的PrinterWriter
节点流--直接连接数据源的流
常见的节点流
- File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream。
- 从/向内存数组读写数据: CharArrayReader与 CharArrayWriter、ByteArrayInputStream与ByteArrayOutputStream。
- 从/向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream。
- Pipe管道流。 实现管道的输入和输出(进程间通信): PipedReader与PipedWriter、PipedInputStream与Pip