Java IO 教程

更新于 2025-12-26

Jakob Jenkov 2020-03-15

Java IO 是 Java 自带的一套用于读写数据(输入和输出)的 API。大多数应用程序都需要处理某些输入,并基于这些输入生成相应的输出。例如,从文件或网络中读取数据,再将数据写入文件,或通过网络返回响应。

Java IO API 位于 java.io 包中。如果你查看该包中的类,会发现其数量庞大且令人困惑:这些类到底有什么用途?面对特定任务时应选择哪一个?如何自定义类来集成到这套体系中?等等。

本教程旨在帮助你理解这些类是如何组织的,以及它们各自的设计目的,从而让你不再纠结于“是否选对了类”或“是否已有现成的类可以满足需求”。


Java 各版本中的 IO 演进

自 Java IO API 首次发布以来,在多个 Java 版本中基本保持稳定。不过也有一些细微变化,比如推荐使用 try-with-resources 语句来更安全地关闭 InputStreamOutputStream。本教程已在多处根据这些变化进行了更新。


java.io 包的适用范围

java.io 包并未涵盖所有类型的输入输出操作。例如,图形用户界面(GUI)或网页的输入输出并不在此包范围内。这类功能由其他组件负责,比如 Swing 项目中的 JFC 类,或 Java EE 中的 Servlet 和 HTTP 相关包。

java.io 主要聚焦于以下场景的输入输出:

  • 文件
  • 网络流
  • 内存缓冲区等

但请注意:java.io 不包含用于打开网络套接字(socket)的类。要进行网络通信,你需要使用 Java Networking API。一旦建立了 socket 连接,就可以通过 InputStreamOutputStream 来读写数据。


Java NIO —— 另一种 IO API

Java 还提供了另一套 IO API:Java NIO。它能实现与 Java IO 和 Networking API 类似的功能,但支持 非阻塞模式(non-blocking mode)。在某些场景下,非阻塞 IO 能显著提升性能。


Java IO 类概览表

下表列出了绝大多数Java IO 类,按以下维度分类:

  • 输入 / 输出
  • 字节流 / 字符流
  • 特定用途(如缓冲、解析等)
类型 字节输入 字节输出 字符输入 字符输出
基础类 InputStream OutputStream Reader
InputStreamReader
Writer
OutputStreamWriter
数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
文件 FileInputStream
RandomAccessFile
FileOutputStream
RandomAccessFile
FileReader FileWriter
管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
缓冲 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
过滤 FilterInputStream FilterOutputStream FilterReader FilterWriter
解析 PushbackInputStream
StreamTokenizer
PushbackReader
LineNumberReader
字符串 StringReader StringWriter
数据 DataInputStream DataOutputStream
格式化数据 PrintStream PrintWriter
对象 ObjectInputStream ObjectOutputStream
工具类 SequenceInputStream