在Java中,I/O(输入/输出)流是用于处理输入和输出操作的抽象概念。Java的I/O库提供了许多类和方法,用于从各种来源(如文件、网络、内存等)读取数据(输入流),以及将数据写入到各种目标(如文件、网络、内存等)中(输出流)。
Java的I/O流大致可以分为以下几种类型:
-
字节流(Byte Streams):
- 字节输入流:
InputStream
- 字节输出流:
OutputStream
这些流用于处理原始字节数据。
FileInputStream
和FileOutputStream
是常见的用于文件操作的字节流。 - 字节输入流:
-
字符流(Character Streams):
- 字符输入流:
Reader
- 字符输出流:
Writer
这些流用于处理字符数据,它们内部使用特定的字符集(如UTF-8)将字节转换为字符或将字符转换为字节。
FileReader
、FileWriter
、BufferedReader
和BufferedWriter
是常见的字符流。 - 字符输入流:
-
缓冲流(Buffered Streams):
- 缓冲字节流:
BufferedInputStream
、BufferedOutputStream
- 缓冲字符流:
BufferedReader
、BufferedWriter
缓冲流提供了一种增加输入/输出性能的方法,因为它们将数据存储在内部缓冲区中,减少了与底层I/O设备的交互次数。
- 缓冲字节流:
-
转换流(Conversion Streams):
InputStreamReader
和OutputStreamWriter
是用于字节流和字符流之间转换的桥梁。它们使用指定的字符集(如UTF-8)将字节转换为字符或将字符转换为字节。
-
其他特定类型的流:
ObjectInputStream
和ObjectOutputStream
用于对象的序列化和反序列化。DataInputStream
和DataOutputStream
提供了对基本数据类型(如int
、double
、String
等)进行高效输入/输出的功能。PrintStream
和PrintWriter
提供了方便的打印和格式化输出功能。
-
节点流(Node Streams) 和 处理流(Processing Streams):
- 节点流(或低级流)直接连接到数据源或目标,如
FileInputStream
和FileOutputStream
。 - 处理流(或高级流)是“连接”到已存在的节点流上为数据提供额外功能的流,如
BufferedReader
和BufferedWriter
。
- 节点流(或低级流)直接连接到数据源或目标,如
在实际应用中,通常会组合使用这些流来满足特定的I/O需求。例如,当你需要从文件中按行读取文本时,你可能会使用FileInputStream
与InputStreamReader
结合BufferedReader
来创建一个可以高效读取文本的流。