1、概述
在上一节中,我们系统学习了File类,并且已经知道File
类的实例用于表示文件或目录的路径名
。
虽然我们可以通过File
实例来访问文件或目录的元数据,甚至可以创建、删除文件或目录,但是,我们却不能通过File
实例来访问文件中存储的内容,本节主要研究通过流来读写数据。
为了能够 读取文件中的内容 或者 向文件中写入内容 ,就需要用到文件输入流或文件输出流,本节将系统讲解通过流完成对文件内容的读取和写入操作。
但千万不要认为我们只能从文件中读取数据或向文件中写入数据,在网络编程部分我们将会学习如何通过 Java 程序从网络上读取数据和向网络发送数据。
2、流
在 Java 语言中,将够 读取数据 或者 写出数据 的对象抽象为 流。
流 类似于生活当中的 水管
,水
可以在 水管
中 定向移动
,正如 数据
可以在 流
中定向移动。
在 Java 传统的 IO 体系种,所有的 流 对应的类型都扩展自四个抽象类:
四个抽象基类其中的 InputStream
和 OutputStream
的子类表示字节流,Reader
和Writer
的子类则表示字符流。
这里所提及的 Stream 一词均表示流,请不要与
java.util.stream.Stream
接口混为一谈。
3、分类
Java中传统的I/O体系可以按照不同的方式对流进行分类:
- 按照流中数据的流向来分类,可以分为 输入流 和 输出流
- 用于实现从外部读取数据到当前程序的流被称作输入流
- 用于实现从当前程序中向外部输出数据的流被称作输出流
- 按照流处理的数据单元来分类,可以划分为 字节流 和 字符流
- 如果某个流在读取或写入数据时以字节为单位,则该流属于字节流
- 如果某个流在读取或写入数据时以字符为单位,则该流属于字符流
- 这里纠正一下个错误,通过字符流读写字符数据时,一个字符未必就占两个字节
- 一个字符有可能是1个字节,也可能是2个、3个、4个字节,这取决于字符编码
- 《疯狂Java讲义》上的说法是不恰当的
- 按照流的功能来分类,可以分为 节点流 和 包装流
- 直接数据节点中读取数据或向数据节点中写入数据的流被称作节点流
- 数据节点可以是磁盘上的文件或其它数据源(比如键盘输入)
- 节点流都比较原始,仅用于实现数据的读取和写入,通常不具备其它功能
- 用于从其它流中读取数据,并实现其它流所不具备的功能的流,被称作包装流
- 包装流也被称作 转换流 或 处理流 或 过滤流
- 包装流通常会提供它内部所包装的流不具备的功能
- 包装流内部所处理的流(也称作所过滤的流)被称作底层支持流
- 直接数据节点中读取数据或向数据节点中写入数据的流被称作节点流
节点流 和 包装流 的关系如下图所示:
节点流和包装流这里的 IO节点 就是前文所提到的 数据节点,它可以是 磁盘上的文件、键盘输入、控制台输出、网络 等。
网友评论