分块读取大文件并比较 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' 属性,因为你只能知道一旦你阅读 后 行的正确条目。不过这是基本的编程。
我有一个包含如下条目的文本文件。
{"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' 属性,因为你只能知道一旦你阅读 后 行的正确条目。不过这是基本的编程。