如何在 Java 中每次从不同的偏移量读取大的字符串文件?
How to read a large file of Strings in chunks, each time from different offset, in Java?
我有一个包含几行的大文件,其中每一行实际上是一个英文单词。完整的文件不适合内存。因此,我想逐块处理它。所以,我需要实现这样的东西:
- 方法一:读取一个块,调用方法二。
- 方法 2:对该块中的字符串进行一些处理,然后返回步骤 1。
我有两个问题。
1.如何实现Method1?我很清楚如何实现Method2。
我知道如何使用 BufferedReader 逐行读取大文件。例如,
BufferedReader br = new BufferedReader(new FileReader(file)) {
String line;
while ((line = br.readLine()) != null) {
// process the line.
}
但我想阅读更多行而不是一行,并在方法 2 中处理所有这些。然后,当我回到 Method1 时,我想再次加载几行...
2. 我的假设是处理一大块行比处理每一行更有效(性能方面)。这个假设是否正确?
这只是基本的编程,如果您想阅读超过 1 行,请阅读。
void method1(java.io.File file) throws IOException {
int n = 10; // Number of lines to read
BufferedReader br = new BufferedReader(new FileReader(file));
List<String> lines;
do {
lines = readNLines(br, n);
method2(lines);
} while (!lines.isEmpty());
}
public void method2(List<String> lines) {
// processing...
}
private List<String> readNLines(BufferedReader reader, int numberOfLines) throws IOException {
List<String> lines = new ArrayList<>(numberOfLines);
String line;
while (lines.size() < numberOfLines && ((line = reader.readLine()) != null)) {
lines.add(line);
}
return lines;
}
BufferedReader 有效地负责读取 块中的行。
所以你的选择真的是:
- 每次调用 readLine() 后,调用您的方法进行处理
- 每次调用 readLine() 后,将该行添加到列表中,然后每次列表达到一定大小时,调用您的方法来处理列表,然后将其清除
所以主要因素是你的 "processing" 实际做了什么:运行 一次在多行上处理在逻辑上是否有意义,处理方法是否可以包括一些优化如果一次传递几行给它?
我有一个包含几行的大文件,其中每一行实际上是一个英文单词。完整的文件不适合内存。因此,我想逐块处理它。所以,我需要实现这样的东西:
- 方法一:读取一个块,调用方法二。
- 方法 2:对该块中的字符串进行一些处理,然后返回步骤 1。
我有两个问题。
1.如何实现Method1?我很清楚如何实现Method2。
我知道如何使用 BufferedReader 逐行读取大文件。例如,
BufferedReader br = new BufferedReader(new FileReader(file)) {
String line;
while ((line = br.readLine()) != null) {
// process the line.
}
但我想阅读更多行而不是一行,并在方法 2 中处理所有这些。然后,当我回到 Method1 时,我想再次加载几行...
2. 我的假设是处理一大块行比处理每一行更有效(性能方面)。这个假设是否正确?
这只是基本的编程,如果您想阅读超过 1 行,请阅读。
void method1(java.io.File file) throws IOException {
int n = 10; // Number of lines to read
BufferedReader br = new BufferedReader(new FileReader(file));
List<String> lines;
do {
lines = readNLines(br, n);
method2(lines);
} while (!lines.isEmpty());
}
public void method2(List<String> lines) {
// processing...
}
private List<String> readNLines(BufferedReader reader, int numberOfLines) throws IOException {
List<String> lines = new ArrayList<>(numberOfLines);
String line;
while (lines.size() < numberOfLines && ((line = reader.readLine()) != null)) {
lines.add(line);
}
return lines;
}
BufferedReader 有效地负责读取 块中的行。
所以你的选择真的是:
- 每次调用 readLine() 后,调用您的方法进行处理
- 每次调用 readLine() 后,将该行添加到列表中,然后每次列表达到一定大小时,调用您的方法来处理列表,然后将其清除
所以主要因素是你的 "processing" 实际做了什么:运行 一次在多行上处理在逻辑上是否有意义,处理方法是否可以包括一些优化如果一次传递几行给它?