Java IO 流

在大多数程序中,都需要对输入输出进行处理。例如我们中需要获取用户从键盘上的输入,需要在控制台输出结果等等。除此之外还有从文件中读取数据,向文件中写入数据等等。在 Java 中,我们把这些不同类型的输入输出源抽象地称为 流,也就是 Stream;在里面输入输出的数据则称为数据流(Data Stream),它们通常具有统一的接口。

于是我们得到了数据流的定义:

一个 Java I/O 对象叫做数据流。读取数据到内存的对象叫做输入流,内存写出数据的对象叫做输出流。

针对其面向的不同角度,我们大致可以将流分为下面几种类型:

  • 按照数据流的方向不同分为 输入流 和 _输出流_。这种分类不是绝对的,例如在向一个文件写入数据时,它就是输出流;而在读取数据时,它就是输入流。
  • 按照处理数据的单位不同分为 字节流字符流
  • 按照功能的不同分为 节点流 和 _处理流_。

需要特别说明,节点流是从特定的数据节点(文件、数据库、内存等)读写数据;处理流是连接在已有的流上,通过对数据的处理为程序提供更多功能。

在 Java 环境中,java.io 包提供了大多数的类和接口来实现输入输出管理。一些标准的输入输出则来自 java.lang 包中的类,但它们都是继承自 java.io 中的类。我们可以将输入流理解为数据的提供者,而把输出流理解为数据的接收者。在最初的时候,这些派生自抽象类 InputStream 和 OutputStream 的输入输出类是面向 8 位的字节流的。但为了支持国际化,又引入了派生自抽象类 Reader 和 Writer 的类层次,用于读写一些双字节的 Unicode 字符。

因此,在学习 java 的输入输出上,我们希望你以字节流和字符流作为区分来学习。

如果需要概括一下,则可以得到下面的定义:

  • 字节流:表示以字节为单位从 stream 中读取或往 stream 中写入信息。通常用来读取二进制数据。
  • 字符流:以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。

按照这样的定义,Java 中流的层级结构可以通过下图来表示:

java层级结构

图中蓝色的部分均为抽象类,而绿色的部分则为派生类,是可以直接使用的。

而下图简要说明了字节流和字符流的区别,你也可以进一步了解字节流与字符流的区别。

java字符流&字节流区别

我们知道 Java 是一门面向对象的语言,所以为了能够永久地保存对象的状态,java.io包还以字节流为基础,通过实现 ObjectInput 和 ObjectOutput 接口提供了 _对象流_。在此仅作引入,你可以通过查阅 API 手册来详细了解它们。