Считывайте строки потоками и сохраняйте по блокам

#java #file #stream

Вопрос:

У меня есть Java-процесс (CronJob из K8S), который читает около 500 тысяч строк файла (в облачном хранилище Google).

Я читаю каждую строку с потоками Java, но «иногда» процесс может быть остановлен (например, из-за проблем с сетью), и процесс перезапускается сам.

Я хотел бы продолжить в том же месте, где процесс остановился. Нет базы данных, в которой можно было бы что-либо сохранить.

Я думал о следующих шагах:

  • Прочитайте файл с: Files.lines(path).forEach
  • Занимайтесь процессом
  • Сохраните в списке массивов строки, которые были прочитаны
  • И удалите эти строки из исходного файла.
  • Если процесс останавливается, при следующем выполнении он считывает файл в том же месте.

Но моя проблема в последнем пункте.

Я пробовал с:

 Files.write(path, listTmp,  StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);
 

Но чтобы работать нормально, я должен загрузить все содержимое файла в список массивов, затем удалить прочитанные строки и сохранить результат.

Есть ли какая-либо возможность избежать чтения всего содержимого файла? Может быть, сохранить номер строки?

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

Комментарии:

1. Зачем продолжать с того же места? Не является ли повторное чтение файла для полного повторного процесса немного более устойчивым?

2. если вы читаете строку за строкой файла, просто следите за тем, какой номер строки вы прочитали, тогда, если ваше соединение прервется, вы знаете, сколько строк вы можете перейти/пропустить в следующий раз, когда начнете читать из файла на номер строки, на котором остановились

3. Привет @aksappy процесс может занять около 6 часов, поэтому нет возможности перезапустить его с самого начала. Спасибо за ваш ответ