07
IO 与 NIO:读写文件
IO Streams · Files · NIO.2 Path / Files
程序要跟硬盘打交道:读配置文件、写日志、导出报表。Java 的 IO 体系乍一看类名一大堆,其实分两派:字节流(InputStream/OutputStream,操作二进制:图片、视频)和字符流(Reader/Writer,操作文本,自动处理编码)。读文本用字符流,别拿字节流硬读中文。
| 场景 | 用什么 | 人话 |
|---|---|---|
| 读文本文件 | BufferedReader 或 NIO.2 | 一行一行读,带缓冲,快。 |
| 写文本文件 | BufferedWriter / Files.writeString | 追加还是覆盖想清楚。 |
| 拷贝图片/视频 | FileInputStream + FileOutputStream | 二进制搬运,别碰编码。 |
| 现代写法 | java.nio.file.Files(Java 7+) | 一行搞定读写,强烈推荐。 |
NIO.2 新写法:Files 工具类,几行顶过去一堆流
import java.nio.file.*;
import java.util.*;
public class FileDemo {
public static void main(String[] args) throws Exception {
Path p = Path.of("note.txt");
// 一行写文本(自动用 UTF-8,自动关闭)
Files.writeString(p, "第一行\n第二行\n");
// 一行读成字符串
String content = Files.readString(p);
System.out.println(content);
// 一行读成行列表
List<String> lines = Files.readAllLines(p);
for (String line : lines) {
System.out.println("读:" + line);
}
}
}
中文乱码的根源
读文件乱码,九成是编码没对齐:文件存的是 UTF-8,你却用 GBK 去读,中文就变成火星文。记住:读写文本统一指定 UTF-8。老版 new FileReader("a.txt") 用的是操作系统默认编码,跨机器就乱码;用 Files.readString(path, StandardCharsets.UTF_8) 显式指定,一劳永逸。
章末面试 · IO 与编码(3 题)
1.(概念题)字节流和字符流区别?读中文文本文件用哪个?
查看答案
答案:字节流(InputStream/OutputStream)操作二进制,字符流(Reader/Writer)操作文本并处理编码。读中文文本用 BufferedReader / Files.readString,别拿字节流硬读。
2.(排错题)读文件中文乱码,最可能的原因?怎么修?
查看答案
答案:编码没对齐。文件是 UTF-8 却用 GBK 读。显式指定 StandardCharsets.UTF_8,别用操作系统默认编码的 FileReader。
3.(代码题)写文本文件一行搞定的现代写法?
查看答案
答案:Files.writeString(path, content, StandardCharsets.UTF_8),自动关流,不用手写 BufferedWriter。