Чтение большого файла построчно с доступом к позиции чтения
У меня есть файл большого размера ~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, он считывает в буфер, но я не могу правильно определить размер буфера, поскольку не знаю, какой длинны будет строка.
Единственное, что мне приходит на ум:
- Считывать в буфер небольшого размера
- Искать /n
- Если символ найден, запоминаем его позицию и в следующий раз считываем в буфер с этой позиции.
- Если символ не найден, считываем в буфер с позиции конца прошлого буфера, и снова ищем /n
Вот только насколько такое решение будет быстрым и корректным. Возможно есть более элегантное решение? Подскажите как мне быть.
Заранее спасибо!