记住口诀:
“先分字节/字符,再分输入/输出,最后看是否带缓冲/转换/对象。”
IO 家谱(只记常用即可)
1. 字节流(raw binary)
InputStream ←┬─ FileInputStream
├─ BufferedInputStream
└─ ObjectInputStream
OutputStream ┬─ FileOutputStream
├─ BufferedOutputStream
└─ ObjectOutputStream
2. 字符流(text,自动编码)
Reader ←┬─ FileReader
├─ BufferedReader
└─ InputStreamReader (桥:字节→字符)
Writer ┬─ FileWriter
├─ BufferedWriter
└─ OutputStreamWriter
10 段必会代码
文件复制(裸字节流)
try (InputStream in = new FileInputStream("src.jpg");
OutputStream out = new FileOutputStream("dst.jpg")) {
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
}
加缓冲 → 提速 5~10 倍
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("dst.jpg"))) {
byte[] buf = new byte[8192];
int len;
while ((len = bis.read(buf)) != -1) bos.write(buf, 0, len);
}
逐行读文本(最常用)
try (BufferedReader br = new BufferedReader(new FileReader("poem.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
指定编码读写 → 避免中文乱码
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream("log.txt"), StandardCharsets.UTF_8));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) bw.write(line + "\n");
}
控制台输入(JDK 8 前写法)
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入名字:");
String name = console.readLine();
System.out.println("你好," + name);
对象序列化 → 写对象到文件
class User implements Serializable { // 必须实现 Serializable
private static final long serialVersionUID = 1L;
String name;
int age;
}
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"))) {
oos.writeObject(new User("Tom", 18));
}
反序列化 → 读对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"))) {
User u = (User) ois.readObject();
System.out.println(u.name + " " + u.age);
}
批量序列化集合
List<User> list = List.of(new User("A", 1), new User("B", 2));
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.dat"))) {
oos.writeObject(list); // 整个 List 都是 Serializable
}
打印流 → 方便写文本/控制台
try (PrintWriter pw = new PrintWriter(new FileWriter("out.txt"))) {
pw.printf("PI=%.2f%n", Math.PI);
pw.println("Hello PrintWriter");
}
随机读写文件(Seek 任意位置)
try (RandomAccessFile rf = new RandomAccessFile("demo.txt", "rw")) {
rf.seek(rf.length()); // 追加
rf.writeUTF("追加一行\n");
rf.seek(0); // 回到开头
System.out.println(rf.readUTF());
}
易错点提醒
-
字符流默认用 系统编码,跨平台易乱码,务必显式指定 UTF-8。
-
对象序列化必须:
-
实现
Serializable -
加
serialVersionUID(兼容升级) -
不想序列化的字段加
transient
-
-
读写文本优先用 BufferedReader/BufferedWriter,性能高且支持
readLine()。 -
操作完一定关流;JDK 7+ 统一用 try-with-resources,自动关、代码少、异常不丢失。
-
flush()时机:缓冲流/打印流在 写完后手动 flush 或 close() 前自动 flush。
速记口诀再背一遍
字节字符先分清,
输入输出对称行;
缓冲提速桥转换,
对象序列要加号;
读写文本 Buffer 先行,
try-with-resources 关闭省心!
2819

被折叠的 条评论
为什么被折叠?



