Java 按行读取大文件的方法
在Java中处理大文件时,需要注意内存使用效率,避免一次性加载整个文件到内存,以下是几种按行读取大文件的有效方法:

使用 BufferedReader(推荐)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadLargeFile {
public static void main(String[] args) {
String filePath = "path/to/your/largefile.txt";
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
// 处理每一行
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
优点:
- 使用缓冲区提高读取效率
- 自动资源管理(try-with-resources)
- 内存占用低,适合大文件
使用 Files.lines (Java 8+)
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ReadLargeFileWithStream {
public static void main(String[] args) {
String filePath = "path/to/your/largefile.txt";
try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
lines.forEach(line -> {
// 处理每一行
System.out.println(line);
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
优点:
- 使用流式处理,内存效率高
- 可以并行处理(
.parallel()) - 代码简洁
使用 Scanner(适合简单场景)
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadLargeFileWithScanner {
public static void main(String[] args) {
String filePath = "path/to/your/largefile.txt";
try (Scanner scanner = new Scanner(new File(filePath))) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
// 处理每一行
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
优点:
- 简单易用
- 自动处理不同行分隔符
缺点:

- 性能不如BufferedReader
使用内存映射文件(超大文件)
对于特别大的文件(GB级别),可以使用内存映射文件:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class ReadLargeFileWithMemoryMapping {
public static void main(String[] args) {
String filePath = "path/to/your/hugefile.txt";
try (RandomAccessFile file = new RandomAccessFile(filePath, "r");
FileChannel channel = file.getChannel()) {
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
StringBuilder line = new StringBuilder();
char ch;
while (buffer.hasRemaining()) {
ch = (char) buffer.get();
if (ch == '\n') {
// 处理一行
System.out.println(line.toString());
line.setLength(0);
} else {
line.append(ch);
}
}
// 处理最后一行(如果没有换行符结尾)
if (line.length() > 0) {
System.out.println(line.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
优点:
- 适合处理超大文件
- 性能接近直接内存访问
最佳实践建议
- 对于大多数大文件场景,使用
BufferedReader或Files.lines()是最佳选择 - 如果需要并行处理,可以使用
Files.lines().parallel() - 对于特别大的文件(GB级别),考虑内存映射文件方法
- 始终使用try-with-resources确保资源正确关闭
- 根据实际需求调整缓冲区大小(BufferedReader默认8KB)
选择哪种方法取决于你的具体需求、文件大小以及性能要求。

