在 Java 中读取文件内容并将其转换为 String 是一个非常常见的操作,根据 Java 版本和具体需求,有多种实现方式。

下面我将从 Java 8 开始,介绍几种最常用和推荐的方法,并附上完整的代码示例。
Java 8+ 使用 Files.readString() (最简单、最推荐)
这是 Java 8 引入的 java.nio.file 包中最简洁、最直接的方法,它一行代码就能完成读取文件并转换为字符串的全部操作。
特点:
- 代码简洁:一行代码搞定。
- 性能良好:内部使用高效的读取机制。
- 需要处理异常:必须处理
IOException。
示例代码
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ReadFileToStringJava8 {
public static void main(String[] args) {
// 文件路径
String filePath = "path/to/your/file.txt";
try {
// 使用 Files.readString() 读取文件内容
// UTF-8 是最常用的编码,如果文件是其他编码,请替换为相应的字符集,如 StandardCharsets.UTF_16
String content = Files.readString(Paths.get(filePath));
// 打印读取到的内容
System.out.println("文件内容:");
System.out.println(content);
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
Java 8+ 使用 Files.readAllLines() 和 String.join()
如果你希望逐行处理文件内容,或者需要对行进行其他操作,可以先读取所有行到一个 List<String> 中,然后再将它们合并成一个字符串。

特点:
- 灵活:可以方便地逐行处理。
- 代码稍多:需要多一步合并操作。
示例代码
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class ReadFileLinesToString {
public static void main(String[] args) {
String filePath = "path/to/your/file.txt";
try {
// 1. 读取所有行到一个 List 中
List<String> lines = Files.readAllLines(Paths.get(filePath), java.nio.charset.StandardCharsets.UTF_8);
// 2. 使用 String.join() 将所有行合并成一个字符串,并用换行符连接
String content = String.join(System.lineSeparator(), lines);
System.out.println("文件内容:");
System.out.println(content);
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
e.printStackTrace();
}
}
}
Java 7+ 使用 BufferedReader 和 try-with-resources (经典方法)
在 Java 8 之前,这是处理文件的标准且高效的方式,即使现在,它也是一个非常好的选择,因为它提供了对读取过程的精细控制(按固定大小的块读取)。
try-with-resources 语句可以确保 BufferedReader 在使用完毕后自动被关闭,无需手动 close(),非常安全。
特点:

- 性能高:缓冲读取,适合大文件。
- 兼容性好:适用于 Java 7 及以上所有版本。
- 代码稍显冗长:需要手动构建读取循环。
示例代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFileWithBufferedReader {
public static void main(String[] args) {
String filePath = "path/to/your/file.txt";
StringBuilder contentBuilder = new StringBuilder();
// 使用 try-with-resources 确保 BufferedReader 自动关闭
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
// 循环读取每一行
while ((line = reader.readLine()) != null) {
contentBuilder.append(line).append(System.lineSeparator());
}
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
e.printStackTrace();
}
// 将 StringBuilder 转换为 String
String content = contentBuilder.toString();
System.out.println("文件内容:");
System.out.println(content);
}
}
Java 6 及更早版本 (旧式方法)
如果你需要在非常古老的 Java 环境中运行代码,可以使用这种方式,它不推荐在现代项目中使用,因为它没有 try-with-resources,资源管理容易出错。
特点:
- 兼容性极广:适用于所有 Java 版本。
- 不推荐:容易忘记关闭资源,导致资源泄漏。
示例代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFileOldWay {
public static void main(String[] args) {
String filePath = "path/to/your/file.txt";
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
reader = new BufferedReader(new FileReader(filePath));
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append(System.lineSeparator());
}
} catch (IOException e) {
System.err.println("读取文件时出错: " + e.getMessage());
e.printStackTrace();
} finally {
// 必须在 finally 块中关闭资源,以确保它被执行
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.err.println("关闭文件时出错: " + e.getMessage());
}
}
}
System.out.println("文件内容:");
System.out.println(content.toString());
}
}
总结与选择建议
| 方法 | Java 版本 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
Files.readString() |
Java 8+ | 代码最简洁,一行搞定 | 无 | 绝大多数情况下的首选,简单、直接、高效。 |
BufferedReader |
Java 7+ | 性能好,灵活,控制力强 | 代码稍多,需要手动拼接字符串 | 需要逐行处理文件内容,或者进行更复杂的流式操作时。 |
Files.readAllLines() |
Java 8+ | 灵活,可方便处理行列表 | 对于大文件,可能会消耗较多内存 | 需要对文件的所有行进行列表操作(如排序、过滤等)。 |
| 旧式方法 | Java 6- | 兼容性广 | 容易出错,不安全 | 维护旧项目,或在不支持 Java 7+ 的环境中运行。 |
核心建议:
- 如果你使用的是 Java 8 或更高版本,请优先使用
Files.readString()。 它是解决这个问题的最佳方式。 - 如果文件非常大,并且你担心内存问题(虽然
Files.readString内部也做了优化),使用BufferedReader逐行处理是更稳妥的选择。 - 始终注意文件的编码,示例中使用了
StandardCharsets.UTF_8,这是最常见的选择,如果文件是GBK、ISO-8859-1等其他编码,请务必指定正确的字符集,否则会出现乱码。
