如何在 Java 中每次从不同的偏移量读取大的字符串文件?

How to read a large file of Strings in chunks, each time from different offset, in Java?

我有一个包含几行的大文件,其中每一行实际上是一个英文单词。完整的文件不适合内存。因此,我想逐块处理它。所以,我需要实现这样的东西:

  1. 方法一:读取一个块,调用方法二。
  2. 方法 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" 实际做了什么:运行 一次在多行上处理在逻辑上是否有意义,处理方法是否可以包括一些优化如果一次传递几行给它?