Java 中的输入输出(I/O)是程序与外部世界(如用户、文件、网络、设备等)进行数据交换的基础功能。Java 提供了丰富的 I/O API 来支持各种类型的输入输出操作。以下是对 Java 中输入输出的主要概念、API 及使用场景的概述:
**1. 基本概念:
- 输入:指从外部获取数据的过程,如从键盘、文件、网络套接字等读取数据。
- 输出:指向外部发送数据的过程,如向屏幕、文件、网络套接字等写入数据。
**2. 主要 API:
① 标准输入输出:
System.in
:标准输入流,通常与键盘关联,可通过InputStreamReader
和BufferedReader
等进行字符读取。System.out
和System.err
:标准输出流和标准错误流,均与屏幕关联,通常使用PrintStream
进行文本输出。
② 文件 I/O:
java.io.File
:表示文件或目录的路径,用于文件操作的辅助类。java.io.FileInputStream
和java.io.FileOutputStream
:用于读写二进制文件。java.io.FileReader
和java.io.FileWriter
:用于读写文本文件。java.nio.file
包(Java 7 引入):提供更为现代、高效的文件 I/O API,如Files
类和Path
接口。
③ 字符流与字节流:
java.io.Reader
和java.io.Writer
:抽象类,分别代表字符输入流和字符输出流,如BufferedReader
、PrintWriter
等。java.io.InputStream
和java.io.OutputStream
:抽象类,分别代表字节输入流和字节输出流,如FileInputStream
、FileOutputStream
等。
④ 缓冲流:
java.io.BufferedInputStream
、BufferedOutputStream
、BufferedReader
、BufferedWriter
:为输入输出流提供缓冲功能,提高读写效率。
⑤ 对象序列化:
java.io.ObjectInputStream
和java.io.ObjectOutputStream
:用于将 Java 对象序列化(写入)和反序列化(读取)到流中,实现对象的持久化存储或网络传输。
⑥ 网络 I/O:
java.net.Socket
和java.net.ServerSocket
:用于实现基于 TCP 协议的网络通信。java.net.DatagramSocket
和java.net.DatagramPacket
:用于实现基于 UDP 协议的网络通信。java.nio.channels
包(Java NIO):提供非阻塞的网络 I/O 支持,如SocketChannel
、ServerSocketChannel
等。
**3. 使用场景:
- 标准输入输出:与用户交互,如从控制台读取用户输入,向控制台输出程序信息。
- 文件 I/O:读写硬盘上的文件,如文本文件、图片、音频、视频等。
- 字符流与字节流:处理文本数据或二进制数据,如读写 XML、JSON 文件,下载或上传文件等。
- 缓冲流:提高读写效率,减少系统调用次数。
- 对象序列化:将对象状态保存到磁盘或通过网络传输对象,如保存游戏进度、实现 RPC(Remote Procedure Call)等。
- 网络 I/O:实现客户端与服务器之间的通信,如 Web 客户端与服务器、邮件客户端与服务器、即时通讯软件等。
**4. Java 7 NIO.2(New I/O 2):
Java 7 引入了 NIO.2(New I/O 2),提供了更高级、更强大的 I/O 功能,包括:
- 异步 I/O:通过
AsynchronousSocketChannel
、AsynchronousServerSocketChannel
等实现非阻塞的异步网络通信。 - 文件锁定:通过
FileChannel.lock()
等方法实现文件的共享或独占锁定。 - 文件属性与元数据:通过
Files
类的静态方法获取文件的各种属性(如大小、最后修改时间、权限等)和元数据。 - 路径与文件系统:
Path
接口和FileSystem
类提供了与文件系统路径和特性相关的操作。
总之,Java 中的输入输出涵盖了与外部数据交换的各种场景,提供了丰富的 API 来满足不同需求。从标准输入输出到文件 I/O、网络通信,再到高级的 NIO.2 功能,Java I/O 系统为开发者构建健壮、高效的软件提供了坚实的基础。在实际编程中,应根据具体需求选择合适的 I/O 类型和方法。