8.4 目录、编码与文件管理
很多文件 bug 不一定来自 read 或 write 本身,而是来自文件周边细节:路径不是你以为的位置、父目录不存在、编码不一致,或者文件管理操作覆盖了重要数据。
相对路径与当前工作目录
相对路径不一定相对于 Java 源文件所在目录。它相对于当前工作目录,通常也就是你运行 java 命令的位置。
java
Path path = Path.of("data", "quotes.txt");
String content = Files.readString(path, StandardCharsets.UTF_8);如果当前工作目录是项目根目录,Java 会寻找:
text
project/
data/
quotes.txt但如果你从其他目录运行程序,同一个相对路径可能找不到文件。
正在加载交互实验...
注意
看到
NoSuchFileException 时,第一步应该检查程序从哪里开始寻找文件。可以打印 Path.of("").toAbsolutePath() 来查看当前工作目录。正在加载概念检查...
创建目录
如果 reports 不存在,直接写入 reports/summary.txt 会失败。应该先创建父目录。
java
Path folder = Path.of("reports");
Files.createDirectories(folder);
Path report = folder.resolve("summary.txt");
Files.writeString(report, "报告已生成" + System.lineSeparator(), StandardCharsets.UTF_8);createDirectories() 不只是“创建一个文件夹”。它会创建缺失的父目录;如果目录已经存在,它什么也不做。
正在加载概念检查...
正在加载本节练习...
UTF-8 编码
文本文件实际保存的是字节。编码负责在字符和字节之间转换。UTF-8 是最常见、兼容性很好的文本编码之一。
java
Path path = Path.of("note.txt");
Files.writeString(path, "Hello, Java!", StandardCharsets.UTF_8);
System.out.println(Files.readString(path, StandardCharsets.UTF_8));如果写入和读取使用不同编码,纯英文可能看起来没问题,但中文和符号很容易出错。除非有明确原因,否则示例里推荐使用 StandardCharsets.UTF_8。
正在加载概念检查...
正在加载本节练习...
列出、复制、移动与删除
Files 可以检查和管理文件:
java
Path path = Path.of("note.txt");
System.out.println(Files.exists(path));
System.out.println(Files.size(path));
System.out.println(Files.isRegularFile(path));目录列表会返回一个 stream,这个 stream 也需要关闭。try-with-resources 可以负责关闭。
java
try (var entries = Files.list(Path.of("reports"))) {
entries.forEach(System.out::println);
}常见管理方法:
Files.copy(source, target):复制文件。Files.move(source, target):移动或重命名文件。Files.delete(path):删除文件,文件不存在时失败。Files.deleteIfExists(path):只有文件存在时才删除。
这些操作可能覆盖、失败或删除数据,要谨慎使用。
正在加载概念检查...