目录
1. 字节流(InputStream 和 OutputStream)
3. 缓冲流(BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter)
4. 转换流(InputStreamReader 和 OutputStreamWriter)
5. 数据流(DataInputStream 和 DataOutputStream)
6. 对象流(ObjectInputStream 和 ObjectOutputStream)
1. 字节流(InputStream 和 OutputStream)
字节流用于处理所有类型的数据,因为它是按字节操作的。这种流特别适合处理图片、音频等二进制文件。就像传送带可以一箱一箱地搬运货物,字节流则是以“字节”为单位来搬运数据。
1.1 InputStream(字节输入流)
InputStream
的作用是读取字节数据,比如从文件、网络中获取数据。它把数据流读入内存,就像水流进池塘一样。
常用类和用途:
- FileInputStream:用于读取文件的字节。比如打开一张图片文件,就可以用
FileInputStream
。 - BufferedInputStream:在原有流的基础上增加了缓冲区,就像用水桶而不是小杯子装水,效率更高。
简单示例:读取文件的字节数据
java
复制代码
FileInputStream fileInput = new FileInputStream("example.jpg"); int byteData; while ((byteData = fileInput.read()) != -1) { System.out.print(byteData + " "); // 打印字节数据 } fileInput.close();
1.2 OutputStream(字节输出流)
OutputStream
的作用是写入字节数据,比如把数据存到文件或网络中。它的工作类似一个水龙头,把数据流输出到指定的地方。
常用类和用途:
- FileOutputStream:用于将数据写入文件。
- BufferedOutputStream:同样提供缓冲区提高效率,可以在写大文件时显著提升速度。
简单示例:写入文件
java
复制代码
FileOutputStream fileOutput = new FileOutputStream("output.txt"); fileOutput.write(65); // 写入字节'A',ASCII 码是 65 fileOutput.close();
2. 字符流(Reader 和 Writer)
字符流以字符为单位处理数据,更适合处理文本数据。可以将字符流理解为“翻译器”,它能将数据解读成字符,方便我们处理中文、英文等字符内容。
2.1 Reader(字符输入流)
Reader
用于读取字符数据,比如从文件中读取文本内容,就像我们在读一本书,看到的是文字而非单独的字母或符号。
常用类和用途:
- FileReader:用于读取文件中的字符数据。可以用来打开
.txt
文件。 - BufferedReader:可以按行读取文本,效率高且方便处理每一行数据。
简单示例:按行读取文件
java
复制代码
BufferedReader reader = new BufferedReader(new FileReader("example.txt")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close();
2.2 Writer(字符输出流)
Writer
用于写入字符数据,比如把文字写入文件。就像我们写一封信,可以将字符数据逐个写入到文件中。
常用类和用途:
- FileWriter:用于将字符数据写入文件。可以用来写
.txt
文件。 - BufferedWriter:增加了缓冲区,写入数据更快,常用于大文本的输出。
简单示例:写入字符到文件
java
复制代码
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt")); writer.write("Hello, World!"); writer.newLine(); // 写入换行符 writer.write("Java IO 流学习!"); writer.close();
3. 缓冲流(BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter)
缓冲流是一种特殊的流,主要目的是提高读写速度。它的工作方式类似于快递公司的集运仓库,把很多件货物一起运输,减少单件运输的成本。
- BufferedInputStream / BufferedOutputStream:这些流主要作用于字节流,在大量数据读写时提高效率。
- BufferedReader / BufferedWriter:主要作用于字符流,适合文本数据的按行读写,简化操作。
简单示例:BufferedReader
读取文件的同时提高速度
java
复制代码
BufferedReader reader = new BufferedReader(new FileReader("example.txt")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); // 读取每一行内容 } reader.close();
4. 转换流(InputStreamReader 和 OutputStreamWriter)
转换流用于在字节流和字符流之间进行转换,尤其是处理不同编码时很有用。它的功能类似于语言翻译器,可以在不同编码的字节和字符之间进行转换。
- InputStreamReader:将字节输入流转换为字符输入流。可以指定编码格式,比如将 UTF-8 字节解读成字符。
- OutputStreamWriter:将字符输出流转换为字节输出流,方便输出不同编码的数据。
简单示例:用指定编码读取文件
java
复制代码
InputStreamReader reader = new InputStreamReader(new FileInputStream("example.txt"), "UTF-8"); int data; while ((data = reader.read()) != -1) { System.out.print((char) data); // 读取字符 } reader.close();
5. 数据流(DataInputStream 和 DataOutputStream)
数据流用于读写 Java 的基本数据类型,类似于打包好的数据传输方案,允许直接写入和读取 int、double、boolean 等数据类型。就像可以直接发送 “数字 42” 而不是一个个字符去拼凑“42”。
- DataInputStream:允许从流中读取 int、float 等基本数据类型。
- DataOutputStream:允许写入 int、float 等数据类型,常用于序列化文件。
简单示例:写入基本数据类型到文件
java
复制代码
DataOutputStream out = new DataOutputStream(new FileOutputStream("data.bin")); out.writeInt(42); // 写入一个整数 out.writeDouble(3.14159); // 写入一个浮点数 out.close();
6. 对象流(ObjectInputStream 和 ObjectOutputStream)
对象流用于读写 Java 对象,前提是对象必须实现 Serializable
接口。这就像寄快递时打包了一个完整的包裹,而不仅仅是某个属性或数据片段。
- ObjectInputStream:从流中读取对象,反序列化成内存中的对象。
- ObjectOutputStream:将对象写入流中,序列化到文件。
简单示例:序列化和反序列化一个对象
java
复制代码
// 写入对象 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.dat")); out.writeObject(new Person("Alice", 30)); // 假设 Person 类实现 Serializable out.close(); // 读取对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.dat")); Person person = (Person) in.readObject(); System.out.println("Name: " + person.getName() + ", Age: " + person.getAge()); in.close();
总结
Java IO 流的设计使得不同类型数据的读写操作既灵活又高效,可以满足不同需求:从简单的文本文件处理到复杂的对象序列化。根据文件内容和读写需求选择合适的流类型,有助于简化代码并提升性能。