返回

Java IO流的奥秘:揭秘字符流、缓冲流、转换流、打印流、数据流和序列化流

后端

探索 Java IO 流的强大力量:超越字节流

在 Java 编程的世界中,输入输出 (IO) 流扮演着至关重要的角色。 而 IO 流不仅仅局限于基本的字节流,它还包含一系列强大且方便的操作流类,可以帮助你驾驭文本、编码、格式化、数据和对象持久化等各种任务。

一、字符流:字节流的文本伴侣

字符流是针对文本数据的 IO 流,它可以以字符为单位进行读写操作。它基于字节流,将字节流中的字节转换为字符,让你可以轻松操作文本数据。

示例:

FileReader reader = new FileReader("text.txt");
BufferedReader bufferedReader = new BufferedReader(reader);

String line;
while ((line = bufferedReader.readLine()) != null) {
    System.out.println(line);
}

bufferedReader.close();

二、缓冲流:IO 操作的加速器

缓冲流在 IO 流的基础上添加了缓冲区,这是一个临时存储数据的区域。它可以减少 IO 操作的次数,从而提高效率。

示例:

BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("data.txt"));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("new_data.txt"));

byte[] buffer = new byte[1024];
int readBytes;
while ((readBytes = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, readBytes);
}

inputStream.close();
outputStream.close();

三、转换流:跨越编码障碍的桥梁

转换流可以将一种编码的字节流转换为另一种编码的字节流。它让你可以轻松处理不同编码的数据。

示例:

InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("unicode.txt"), "UTF-8");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("ascii.txt"), "US-ASCII");

int c;
while ((c = inputStreamReader.read()) != -1) {
    outputStreamWriter.write(c);
}

inputStreamReader.close();
outputStreamWriter.close();

四、打印流:格式化输出的神兵利器

打印流可以将数据以格式化的方式输出到输出流。它让你可以轻松输出美观易读的数据。

示例:

PrintStream printStream = new PrintStream(System.out);
printStream.printf("用户名:%s", "John Doe");
printStream.println("年龄:30");

printStream.close();

五、数据流:字节流的进阶版

数据流可以将基本数据类型的数据以二进制形式写入输出流或从输入流中读取。它让你可以轻松操作基本数据类型的数据。

示例:

DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("data.bin"));
dataOutputStream.writeInt(123);
dataOutputStream.writeDouble(3.14);

dataOutputStream.close();

DataInputStream dataInputStream = new DataInputStream(new FileInputStream("data.bin"));
int number = dataInputStream.readInt();
double decimal = dataInputStream.readDouble();

dataInputStream.close();

六、序列化流:对象持久化的魔法

序列化流可以将对象的的状态信息以二进制形式写入输出流或从输入流中读取。它让你可以轻松持久化对象,实现对象的存储和传输。

示例:

ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.ser"));
objectOutputStream.writeObject(new Person("John Doe", 30));

objectOutputStream.close();

ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("object.ser"));
Person person = (Person) objectInputStream.readObject();

objectInputStream.close();

常见问题解答

1. 字节流和字符流有什么区别?

字节流操作字节,而字符流操作字符。

2. 缓冲流的优势是什么?

缓冲流减少了 IO 操作的次数,提高了效率。

3. 转换流有什么用?

转换流允许你处理不同编码的数据。

4. 打印流的用途是什么?

打印流用于格式化输出,使输出美观易读。

5. 序列化流是如何工作的?

序列化流将对象的状态信息转换为二进制形式,用于对象的持久化和传输。