Files.readString和Files.writeString简化了小到中等文本文件的读写,自动处理编码(默认UTF-8)、资源关闭,一行代码完成;但不适用于大文件或需流式处理的场景。

Java 11 引入的 Files.readString 和 Files.writeString 让文本文件的读写变得非常简洁,无需手动处理流、编码、资源关闭等细节,适合快速读写小到中等大小的文本内容。
直接读取整个文件为字符串
用 readString 替代传统 Files.lines() + Collectors.joining() 或 BufferedReader 手动拼接:
- 自动按指定字符集(默认 UTF-8)解码,避免乱码
- 内部已确保资源正确关闭,不用 try-with-resources
- 一行代码完成读取:
String content = Files.readString(path); - 指定编码也很简单:
Files.readString(path, StandardCharsets.UTF_16)
一行写入字符串到文件
writeString 省去创建 OutputStreamWriter 或 Files.write() 的字节数组转换步骤:
- 默认使用 UTF-8 编码写入,行为与
readString默认解码一致 - 支持常见选项:覆盖(默认)、追加(
StandardOpenOption.APPEND)、创建父目录(StandardOpenOption.CREATE+StandardOpenOption.CREATE_NEW) - 示例:
Files.writeString(path, "Hello\nWorld", StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)
注意适用边界和常见陷阱
这两个方法设计目标是“简单场景”,不适用于所有情况:
立即学习“Java免费学习笔记(深入)”;
- 文件不宜过大(建议 ≤ 几十 MB),否则可能引发内存溢出(整文件加载进内存)
- 不支持逐行处理、流式解析或部分读写;大文件或需校验/转换的场景仍应选
BufferedReader/BufferedWriter - 异常仍是
IOException,需捕获或声明,不能忽略 - 写入时若未显式指定
CREATE,而父目录不存在,会抛NoSuchFileException
对比传统写法,差异一目了然
以前读一个文本文件要这样:
String content;
try (var reader = Files.newBufferedReader(path)) {
content = reader.lines().collect(Collectors.joining("\n"));
}
现在只需:
String content = Files.readString(path);
写入同理——少写一半代码,逻辑更直白,出错点更少。


















