Java 的 I/O(输入/输出)流是处理数据读写的机制。它们提供了与外部世界(如文件、网络、控制台等)进行交互的能力。Java I/O 流体系结构广泛应用于文件操作、网络通信、数据序列化等任务。
Java I/O 流的基本概念
-
流(Stream):
- 流是一个数据通道,可以是输入流或输出流。输入流用于读取数据,输出流用于写入数据。
-
字节流与字符流:
- 字节流(Byte Stream):处理原始二进制数据。适用于所有类型的数据,如图片、音频、视频等。字节流以
InputStream
和OutputStream
为基类。 - 字符流(Character Stream):处理文本数据,自动处理字符编码。适用于文本数据。字符流以
Reader
和Writer
为基类。
- 字节流(Byte Stream):处理原始二进制数据。适用于所有类型的数据,如图片、音频、视频等。字节流以
字节流
-
InputStream(字节输入流):
FileInputStream
:从文件读取字节数据。BufferedInputStream
:提供缓冲功能,提高读取效率。ObjectInputStream
:反序列化对象。
-
OutputStream(字节输出流):
FileOutputStream
:将字节数据写入文件。BufferedOutputStream
:提供缓冲功能,提高写入效率。ObjectOutputStream
:序列化对象。
字符流
-
Reader(字符输入流):
FileReader
:从文件读取字符数据。BufferedReader
:提供缓冲功能,支持按行读取文本。StringReader
:从字符串读取字符数据。
-
Writer(字符输出流):
FileWriter
:将字符数据写入文件。BufferedWriter
:提供缓冲功能,提高写入效率。PrintWriter
:提供便利的方法来格式化输出文本。
流的常见操作
-
读取数据:
- 使用
InputStream
或Reader
的read()
方法从流中读取数据。
- 使用
-
写入数据:
- 使用
OutputStream
或Writer
的write()
方法将数据写入流中。
- 使用
-
关闭流:
- 使用
close()
方法关闭流,释放系统资源。建议使用try-with-resources
语句来自动关闭流。
- 使用
示例代码
字节流示例:读取和写入文件
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream inputStream = new FileInputStream("input.txt");
FileOutputStream outputStream = new FileOutputStream("output.txt")) {
int data;
while ((data = inputStream.read()) != -1) {
outputStream.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
字符流示例:读取和写入文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
序列化与反序列化
- 序列化:将对象的状态转换为字节流,以便存储或传输。使用
ObjectOutputStream
进行序列化。 - 反序列化:将字节流转换为对象的状态。使用
ObjectInputStream
进行反序列化。
总结
- 字节流:用于处理二进制数据,适用于所有数据类型。
- 字符流:用于处理文本数据,支持字符编码转换。
- I/O 操作:包括读取数据、写入数据和关闭流。
- 序列化/反序列化:用于对象的持久化存储和传输。
Java 的 I/O 流机制提供了强大的数据处理能力,适用于各种文件和数据处理任务。