簡體   English   中英

讀取塊中的大文件並比較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 時間。 (start - end) 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 的“結束”進行比較。

考慮到輸入文件的大小可能非常大,我覺得這不太合適。

這很奇怪。 事實上,這正是正確的方法。 錯誤的方法是閱讀整個內容。

唯一的例外是,如果單行本身可以是真正巨大的(比如說 128MB 或以上——那是……很長的一行)。

那是 JSON 格式,你需要一個 JSON 閱讀器。 我建議傑克遜

使用該行的結構創建一個類,大概類似於:

enum State {
  start, end;
}

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

然后,讀取一行,讓 Jackson 將該行轉換為 Event 的一個實例,對其進行處理,然后重復,直到完成文件。 只要任何給定的行不是太長,這將允許您處理一個大小為許多 GB 的文件。

如果單行長得離譜:嗯,JSON 並不是真正為“流式傳輸”而設計的,因此大多數 JSON 庫都不會這樣做,或者至少不會讓它變得簡單。 因此,我強烈建議您不要嘗試編寫可以“流式傳輸”單行的內容,除非您確定確實需要這樣做。

這里唯一稍微復雜的事情是你需要記住最后讀取的條目,這樣你就可以在那個時候更新它的“花費時間”屬性,因為你只有在閱讀了正確條目之后的行才能知道這一點。 這是基本的編程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM