简介

Java I/O 流(Input/Output Stream)是 Java 中进行数据输入和输出的核心组件,分为字节流和字符流两大类。它们可以处理文件、内存、网络、管道等不同的 I/O 源。

IO 流

IO 流层次结构图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
java.io.InputStream
├── FileInputStream
├── BufferedInputStream
├── DataInputStream
├── ObjectInputStream
├── ByteArrayInputStream
└── PipedInputStream

java.io.OutputStream
├── FileOutputStream
├── BufferedOutputStream
├── DataOutputStream
├── ObjectOutputStream
├── ByteArrayOutputStream
└── PipedOutputStream

java.io.Reader
├── FileReader
├── BufferedReader
├── InputStreamReader
├── StringReader
└── PipedReader

java.io.Writer
├── FileWriter
├── BufferedWriter
├── OutputStreamWriter
├── StringWriter
└── PipedWriter

以上的 IO 流主要分为两个大类:

  1. 字节流(Byte Streams)
    字节流处理的是二进制数据(8 位字节),用于处理任意类型的文件,如图像、音频等。字节流的两个核心抽象类是:
    • InputStream:字节输入流,用于从数据源读取字节数据。
    • OutputStream:字节输出流,用于向目标输出字节数据。
  2. 字符流(Character Streams)
    字符流处理的是文本数据(16 位 Unicode 字符),用于处理文本文件。字符流的两个核心抽象类是:
    • Reader:字符输入流,用于从数据源读取字符。
    • Writer:字符输出流,用于向目标输出字符。

常用类:

  1. InputStream
    • FileInputStream:从文件中读取字节数据。
    • BufferedInputStream:为输入流提供缓冲机制,减少对磁盘等资源的频繁访问。
    • DataInputStream:用于读取 Java 基本数据类型(如 int、float 等)。
    • ObjectInputStream:用于反序列化对象,从流中恢复对象。
    • ByteArrayInputStream:从字节数组中读取字节数据。
    • PipedInputStream:实现管道输入流,用于线程间通信。
  2. OutputStream
    • FileOutputStream:向文件中写入字节数据。
    • BufferedOutputStream:为输出流提供缓冲机制,减少频繁的磁盘写入操作。
    • DataOutputStream:用于将 Java 基本数据类型写入到输出流中。
    • ObjectOutputStream:用于序列化对象,并将其写入输出流。
    • ByteArrayOutputStream:将字节数据写入字节数组中。
    • PipedOutputStream:实现管道输出流,用于线程间通信。
  3. Reader
    • FileReader:从文件中读取字符数据,通常是文本文件。
    • BufferedReader:为输入流提供缓冲机制,提高读取效率,提供按行读取的功能(readLine())。
    • InputStreamReader:将字节流转换为字符流(常用于字节流与字符流之间的桥梁,如读取带有编码的文件)。
    • StringReader:从字符串中读取字符数据。
    • PipedReader:实现管道字符输入流,用于线程间通信。
  4. Writer
    • FileWriter:向文件中写入字符数据,通常是文本文件。
    • BufferedWriter:为输出流提供缓冲机制,提高写入效率。
    • OutputStreamWriter:将字符流转换为字节流(常用于将字符数据写入带有编码的输出流中)。
    • StringWriter:将字符数据写入字符串。
    • PipedWriter:实现管道字符输出流,用于线程间通信。