FileReader和
BufferedReader逐行读取文本;利用
Files.readAllLines()一次性加载所有行到集合;或用
Files.readString()(JDK11+)直接读取为字符串,二进制文件则推荐
FileInputStream或
Files.readAllBytes()。
在Java中读取文档内容是常见的文件操作任务,适用于日志分析、数据导入或配置文件处理等场景,以下是几种高效可靠的方法,每种方法均附代码示例和适用场景分析,确保代码健壮性(使用try-with-resources自动关闭资源,避免内存泄漏)。
使用 BufferedReader + FileReader(经典文本读取)
适用场景:逐行读取文本文件(如.txt, .csv),适合大文件处理。
优势:内存占用低,通过缓冲区提升读取效率。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFileExample {
public static void main(String[] args) {
String filePath = "example.txt"; // 文件路径
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 处理每一行内容
}
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
}
}
}
使用 Files 类(Java 7+ 推荐)
适用场景:快速读取小文本文件(如配置文件)。
优势:代码简洁,一行完成读取,但会一次性加载整个文件到内存。
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
public class ReadFileExample {
public static void main(String[] args) {
String filePath = "example.txt";
try {
// 读取所有行到List
List<String> lines = Files.readAllLines(Paths.get(filePath));
for (String line : lines) {
System.out.println(line);
}
// 或直接读取为字符串
String content = new String(Files.readAllBytes(Paths.get(filePath)));
System.out.println(content);
} catch (IOException e) {
System.err.println("文件读取异常: " + e.getMessage());
}
}
}
使用 Scanner(灵活解析文本)
适用场景:需按分隔符(如空格、逗号)解析内容(如结构化数据)。
优势:支持正则表达式分割,灵活处理复杂格式。

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class ReadFileExample {
public static void main(String[] args) {
File file = new File("example.txt");
try (Scanner scanner = new Scanner(file)) {
scanner.useDelimiter(","); // 设置分隔符(例如CSV文件)
while (scanner.hasNext()) {
String token = scanner.next();
System.out.println(token); // 处理每个字段
}
} catch (IOException e) {
System.err.println("文件解析错误: " + e.getMessage());
}
}
}
使用 FileInputStream(二进制文件读取)
适用场景:非文本文件(如图片、PDF、视频)。
优势:直接操作字节流,保留原始数据。
import java.io.FileInputStream;
import java.io.IOException;
public class ReadFileExample {
public static void main(String[] args) {
String filePath = "image.png";
try (FileInputStream inputStream = new FileInputStream(filePath)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
// 处理字节数据(例如保存或转码)
processBytes(buffer, bytesRead);
}
} catch (IOException e) {
System.err.println("二进制文件读取失败: " + e.getMessage());
}
}
private static void processBytes(byte[] buffer, int length) {
// 自定义处理逻辑(如写入到其他流)
}
}
关键注意事项
-
文件编码:
文本文件需注意编码格式(如UTF-8),若出现乱码,指定编码:BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8) ); -
大文件处理:
避免Files.readAllLines(),改用BufferedReader逐行读取,防止内存溢出。
-
异常处理:
务必捕获IOException,记录错误信息或回退操作。 -
资源释放:
使用 try-with-resources(如try (BufferedReader reader = ...))确保资源自动关闭,防止文件句柄泄漏。
| 方法 | 适用场景 | 内存占用 | 性能 |
|---|---|---|---|
BufferedReader |
大文本文件逐行处理 | 低 | 高 |
Files类 |
小文本文件 | 高 | 快 |
Scanner |
结构化文本解析 | 中 | 中 |
FileInputStream |
二进制文件 | 低 | 高 |
提示:根据需求选择方法,优先使用
Files类简化代码,大文件场景用BufferedReader,二进制数据用FileInputStream。
权威引用说明
- Java官方文件I/O文档:Oracle Java Files
try-with-resources语法规范:Java SE 7 try-with-resources- 字符编码处理指南:Unicode in Java
通过以上方法,您可安全高效地处理各类文档,遇到复杂场景时,建议结合Apache Commons IO或Guava等库简化代码(如FileUtils.readFileToString)。
