Java IO 流详解

IO(Input/Output,输入/输出)流 是 Java 处理数据读取和写入的基础,广泛用于文件操作、网络通信、数据传输等场景。Java 的 IO 主要分为 字节流字符流,并且提供了 缓冲流数据流对象流 等高级流来提高效率和扩展功能。


1. Java IO 流的基本分类

Java 的 IO 流可以从不同维度进行分类:

按数据类型分类

流类型 作用 常用类
字节流 字节(8bit) 方式操作数据,适用于所有类型文件(文本、图片、视频) InputStream / OutputStream
字符流 字符(16bit) 方式操作数据,适用于文本文件(txt、csv、json) Reader / Writer

按数据流向分类

方向 作用 字节流 字符流
输入流 从外部(文件、网络)读数据 InputStream Reader
输出流 向外部(文件、网络)写数据 OutputStream Writer

2. 字节流(InputStream / OutputStream)

字节流(Byte Stream) 适用于处理所有类型的数据,如 图片、音频、视频、二进制文件,它不会对数据进行编码转换。

📌 2.1 字节输入流(InputStream)

用于 读取 字节数据,常见的子类有:

  • FileInputStream —— 读取文件
  • BufferedInputStream —— 带缓冲,提高读取效率
  • DataInputStream —— 读取基本数据类型(intdouble 等)

示例:使用 FileInputStream 读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("test.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data); // 逐字节读取并转换为字符
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

🔹 read() 方法 每次读取 1 个字节-1 表示文件读取结束。


📌 2.2 字节输出流(OutputStream)

用于 写入 字节数据,常见的子类有:

  • FileOutputStream —— 写入文件
  • BufferedOutputStream —— 带缓冲,提高写入效率
  • DataOutputStream —— 写入基本数据类型

示例:使用 FileOutputStream 写入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
String data = "Hello, Java IO!";
fos.write(data.getBytes()); // 将字符串转换为字节数组写入
} catch (IOException e) {
e.printStackTrace();
}
}
}

🔹 getBytes() 方法将字符串转换为 字节数组 后写入文件。


3. 字符流(Reader / Writer)

字符流(Character Stream) 适用于处理 文本文件,它使用 Unicode 编码,自动处理字符编码转换。

📌 3.1 字符输入流(Reader)

用于 读取 字符数据,常见的子类有:

  • FileReader —— 读取文件
  • BufferedReader —— 带缓冲,提高读取效率
  • InputStreamReader —— 字节流转字符流(可指定编码)

示例:使用 BufferedReader 逐行读取文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // 按行读取,提高效率
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

🔹 readLine() 方法每次 读取一整行,比 read() 更高效。


📌 3.2 字符输出流(Writer)

用于 写入 字符数据,常见的子类有:

  • FileWriter —— 写入文件
  • BufferedWriter —— 带缓冲,提高写入效率
  • OutputStreamWriter —— 字节流转字符流(可指定编码)

示例:使用 BufferedWriter 写入文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
public static void main(String[] args) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("Hello, Java IO!");
bw.newLine(); // 写入换行符
bw.write("This is a new line.");
} catch (IOException e) {
e.printStackTrace();
}
}
}

🔹 newLine() 方法写入 换行符,适用于多行文本文件。


4. 高级 IO 流

除了基本的 InputStreamReader,Java 还提供了 高级流 以提高性能和扩展功能。

流类型 作用 常用类
缓冲流 提高读写效率 BufferedInputStream / BufferedReader
数据流 读写基本数据类型(intdouble DataInputStream / DataOutputStream
对象流 读写对象(序列化) ObjectInputStream / ObjectOutputStream
转换流(字节→字符) 处理不同编码格式的文本 InputStreamReader / OutputStreamWriter

示例:对象流(对象序列化与反序列化)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.*;

class Person implements Serializable { // 必须实现 Serializable 接口
String name;
int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}
}

public class ObjectStreamExample {
public static void main(String[] args) throws Exception {
Person person = new Person("Alice", 25);

// 序列化对象
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
oos.writeObject(person);
}

// 反序列化对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
Person p = (Person) ois.readObject();
System.out.println("姓名: " + p.name + ", 年龄: " + p.age);
}
}
}

5. 总结

  • 字节流(InputStream / OutputStream):适用于 二进制文件(图片、视频)。
  • 字符流(Reader / Writer):适用于 文本文件(txt、json)。
  • 缓冲流(BufferedReader / BufferedWriter):提高 IO 性能
  • 对象流(ObjectInputStream / ObjectOutputStream):对象序列化 和 反序列化。

理解这些流的区别和应用场景,可以帮助你更高效地进行文件处理和数据流操作!🚀