Java, как начать чтение файла после N-й строки с хорошей производительностью - PullRequest
0 голосов
/ 21 марта 2019

У меня есть файл, в который данные продолжают добавляться. Я использую Java для чтения этого файла и обработки данных. Чтобы получить последние данные, я сохраняю смещение до того места, где я прочитал файл, и продолжаю чтение с этого смещения, когда следующий процесс java будет запущен.

RandomAccessFile f = new RandomAccessFile("file.txt","r");
f.seek(offset)

Проблема здесь в производительности. Это примерно в 300 раз медленнее, чем BufferedReader. Можно ли возобновить чтение с определенной строки, используя BufferedReader?

import java.io.RandomAccessFile;
import java.io.FileReader;
import java.io.IOException;

public class ReadFileExample {

 public static void main(String[] args) {
  RandomAccessFile objReader = null;
  try {
   String strCurrentLine;
   long startTime = System.currentTimeMillis();

   objReader = new RandomAccessFile("auditlog-2018-12-21.txt", "r");

   while ((strCurrentLine = objReader.readLine()) != null) {

   }
   System.out.println(System.currentTimeMillis()-startTime);

  } catch (Exception e) {

   e.printStackTrace();

  } finally {

   try {
    if (objReader != null)
     objReader.close();
   } catch (IOException ex) {
    ex.printStackTrace();
   }
  }
 }
}

Чтение 30M файла, содержащего 100 000 строк, занимает 12 с, а замена RandomAccessFile на BufferReader занимает менее 400 мс.

1 Ответ

0 голосов
/ 21 марта 2019

Вы можете попробовать следующий код

try {
    BufferedReader reader = Files.newBufferedReader(Paths.get("file.txt"), StandardCharsets.UTF_8);
    List<String> line = reader.lines().skip(31).limit(1).collect(Collectors.toList());
    line.stream().forEach(System.out::println);
    }catch(Exception e){

    }
...