Jakob Jenkov 2020-03-15
Java IO 是 Java 自带的一套用于读写数据(输入和输出)的 API。大多数应用程序都需要处理某些输入,并基于这些输入生成相应的输出。例如,从文件或网络中读取数据,再将数据写入文件,或通过网络返回响应。
Java IO API 位于 java.io 包中。如果你查看该包中的类,会发现其数量庞大且令人困惑:这些类到底有什么用途?面对特定任务时应选择哪一个?如何自定义类来集成到这套体系中?等等。
本教程旨在帮助你理解这些类是如何组织的,以及它们各自的设计目的,从而让你不再纠结于“是否选对了类”或“是否已有现成的类可以满足需求”。
Java 各版本中的 IO 演进
自 Java IO API 首次发布以来,在多个 Java 版本中基本保持稳定。不过也有一些细微变化,比如推荐使用 try-with-resources 语句来更安全地关闭 InputStream 或 OutputStream。本教程已在多处根据这些变化进行了更新。
java.io 包的适用范围
java.io 包并未涵盖所有类型的输入输出操作。例如,图形用户界面(GUI)或网页的输入输出并不在此包范围内。这类功能由其他组件负责,比如 Swing 项目中的 JFC 类,或 Java EE 中的 Servlet 和 HTTP 相关包。
java.io 主要聚焦于以下场景的输入输出:
- 文件
- 网络流
- 内存缓冲区等
但请注意:java.io 不包含用于打开网络套接字(socket)的类。要进行网络通信,你需要使用 Java Networking API。一旦建立了 socket 连接,就可以通过 InputStream 和 OutputStream 来读写数据。
Java NIO —— 另一种 IO API
Java 还提供了另一套 IO API:Java NIO。它能实现与 Java IO 和 Networking API 类似的功能,但支持 非阻塞模式(non-blocking mode)。在某些场景下,非阻塞 IO 能显著提升性能。
Java IO 类概览表
下表列出了绝大多数Java IO 类,按以下维度分类:
- 输入 / 输出
- 字节流 / 字符流
- 特定用途(如缓冲、解析等)