IO流听不懂?如何快速上手
一、什么是 IO 流?
IO(Input/Output)即输入/输出,是 Java 中用于处理设备之间数据传输的机制。常见的设备包括:文件、网络连接、内存缓冲区等。
Java IO 主要通过 java.io 包中的类实现。
二、IO 流的分类
分类 | 描述 |
---|---|
按方向 | 输入流(读取)、输出流(写入) |
按单位 | 字节流(8位)、字符流(16位 Unicode) |
按功能 | 节点流(直接操作数据源)、处理流(增强节点流的功能) |
✅ 常用类结构图:
字节流:
InputStream / OutputStream字符流:
Reader / Writer
三、常见 IO 类型及用途
类名 | 用途 |
---|---|
FileInputStream / FileOutputStream | 文件字节流,用于读写二进制文件(如图片) |
FileReader / FileWriter | 文件字符流,用于读写文本文件 |
BufferedReader / BufferedWriter | 带缓冲的字符流,提高读写效率 |
ObjectInputStream / ObjectOutputStream | 对象流,支持对象序列化与反序列化 |
四、常用操作及代码示例
✅ 示例1:使用 `FileReader` 读取文本文件内容
import java.io.FileReader;
import java.io.IOException;public class FileReaderExample {public static void main(String[] args) {// 使用 try-with-resources 自动关闭资源try (FileReader reader = new FileReader("example.txt")) {int ch;while ((ch = reader.read()) != -1) { // 逐个字符读取System.out.print((char) ch);}} catch (IOException e) {e.printStackTrace();}}
}
🔍 说明:
FileReader 是字符流,适合读取文本文件。
read() 返回的是字符的 ASCII 码,需强转为 char。
try-with-resources 会自动调用 close(),避免资源泄漏。
✅ 示例2:使用 BufferedWriter 写入文本到文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferedWriterExample {public static void main(String[] args) {try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {writer.write("Hello, Java IO!"); // 写入字符串writer.newLine(); // 换行writer.write("这是第二行");} catch (IOException e) {e.printStackTrace();}}
}
🔍 说明:
BufferedWriter 提供了缓冲机制,提高了写入效率。
newLine() 方法用于跨平台换行。
✅ 示例3:复制文件(使用字节流)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class FileCopyExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("source.jpg");FileOutputStream fos = new FileOutputStream("copy.jpg")) {byte[] buffer = new byte[1024]; // 缓冲区int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead); // 从缓冲区写入}} catch (IOException e) {e.printStackTrace();}}
}
🔍 说明:
使用 byte[]`缓冲区进行高效读写。
适用于任何类型的文件(如图片、视频等二进制文件)。
✅ 示例4:对象序列化与反序列化(对象流)
import java.io.*;class Person implements Serializable { // 必须实现 Serializable 接口private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}public class ObjectStreamExample {public static void main(String[] args) {String filename = "person.ser";// 序列化:将对象写入文件try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {Person p = new Person("张三", 25);oos.writeObject(p);System.out.println("对象已写入文件");} catch (IOException e) {e.printStackTrace();}// 反序列化:从文件中读取对象try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {Person p = (Person) ois.readObject();System.out.println("读取的对象:" + p);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
🔍 说明:
Serializable是一个标记接口,表示该类可以被序列化。
ObjectOutputStream 和 ObjectInputStream 支持对象的持久化保存和恢复。
五、注意事项
1. 一定要关闭流资源:使用 try-with-resources 可以自动关闭。
2. 字符流 vs 字节流:
文本文件 → 字符流(如 .txt)
图片、音频、视频等 → 字节流
3. 缓冲流更高效:如 BufferedReader、BufferedWriter、BufferedInputStream等。
4. 异常处理很重要:IO 操作容易出错,必须捕获并处理 IOException。
六、思维导图
Java IO 流
├── 字节流
│ ├── InputStream
│ └── OutputStream
├── 字符流
│ ├── Reader
│ └── Writer
├── 节点流
│ ├── FileInputStream
│ ├── FileOutputStream
│ ├── FileReader
│ └── FileWriter
└── 处理流├── BufferedInputStream├── BufferedOutputStream├── BufferedReader├── BufferedWriter├── ObjectInputStream└── ObjectOutputStream