Чтение большого файла построчно с доступом к позиции чтения

У меня есть файл большого размера ~5-6GB. Я читаю его в два подхода, в первый подход я провожу индексацию файла, и запоминаю позицию некоторых строк, во второй раз я должен буду сравнивать эти строки с эталонными значениями. На данный момент мой код выглядит так:

try (RandomAccessFile fileRead = new RandomAccessFile(file, "r")) {
    //deep, type (0 - section, 1 - mainPar, 2 - secondPar), line
    Map<Integer, Map<Integer, List<Integer>>> deepIndex = new HashMap<>();
    String line;
    int lineIndex = 0;

    while ((line = fileRead.readLine()) != null) {
        if (line.contains(sectionStart)) {
            deepIndex
                    .computeIfAbsent(StringUtils.countMatches(line, sectionBorder), HashMap::new)
                    .computeIfAbsent(0, ArrayList::new)
                    .add(lineIndex);
        } else if (line.contains(parMain)) {
            deepIndex
                    .computeIfAbsent(StringUtils.countMatches(line, sectionBorder), HashMap::new)
                    .computeIfAbsent(1, ArrayList::new)
                    .add(lineIndex);
        } else if (line.contains(parSecond)) {
            deepIndex
                    .computeIfAbsent(StringUtils.countMatches(line, sectionBorder), HashMap::new)
                    .computeIfAbsent(2, ArrayList::new)
                    .add(lineIndex);
        }
        ++lineIndex;
    }
} catch (IOException e) { e.printStackTrace(); }

Насколько я знаю, RandomAccessFile не позволит мне легко читать файл очень большого размера (поправьте меня если ошибаюсь) Я нашёл FileChannel, он считывает в буфер, но я не могу правильно определить размер буфера, поскольку не знаю, какой длинны будет строка.

Единственное, что мне приходит на ум:

  1. Считывать в буфер небольшого размера
  2. Искать /n
  3. Если символ найден, запоминаем его позицию и в следующий раз считываем в буфер с этой позиции.
  4. Если символ не найден, считываем в буфер с позиции конца прошлого буфера, и снова ищем /n

Вот только насколько такое решение будет быстрым и корректным. Возможно есть более элегантное решение? Подскажите как мне быть.

Заранее спасибо!


Ответы (0 шт):