分块读取大文件并比较 Java 中的每一行

Read Large file in Chunks and Compare each line in Java

我有一个包含如下条目的文本文件。

{"id":"event1","state":"start","timestamp":"11025373"}
{"id":"event1","state":"end","timestamp":"11025373"}
{"id":"event2","state":"start","timestamp":"11025387"}
{"id":"event3","state":"start","timestamp":"11025388"}
{"id":"event3","state":"end","timestamp":"11025391"}
{"id":"event2","state":"end","timestamp":"11025397"}

我想读取文件作为输入并使用 Java 比较每个事件消耗的时间。像 event1 花费了 (11025373 - 11025373) = 4ms 的时间。 (开始 - 结束) event2 花费了 (11025397 - 11025387) = 10ms 时间。

我最初想逐行阅读。

File file = new File("C:\Users\xyz\inputfile.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null)
LOGGER.info(line);

考虑到输入文件的大小可能非常大,这是正确的方法吗?。 任何有关最佳方法的建议都会有所帮助。以及如何比较文件中的每个对象,即如果我逐行比较 event1 的“开始”和 event1 的“结束”。

Considering the input file size can be very Large this is not not suitable I feel.

这很奇怪。事实上,这恰恰是正确的做法。错误的做法是将整个内容读入。

唯一的例外是,如果单行本身真的很庞大(比如说 128MB 或更大 - 那是.. 很长的一行)。

也就是JSON格式,需要一个JSONreader。我建议 Jackson.

用那行的结构做一个class,大概是这样的:

enum State {
  start, end;
}

class Event {
  String id;
  State state;
  long timestamp;
}

然后,读取一行,让 Jackson 将该行转换为 Event 的一个实例,处理它,然后重复,直到您完成文件。只要您愿意,这将允许您处理大小为许多 GB 的文件,只要任何给定的行都不会太长。

如果单个 长得离谱:好吧,JSON 并不是真正为 'streaming' 设计的,因此大多数 JSON 库都不会这样做,或者至少不会让它变得容易。因此,我强烈建议您不要尝试编写可以 'stream' 一行的东西,除非您确定确实需要这样做。

这里唯一稍微复杂的事情是你需要记住上次阅读的条目,这样你就可以在那个时候更新它的 'time taken' 属性,因为你只能知道一旦你阅读 行的正确条目。不过这是基本的编程。