我有一個包含如下條目的文本檔案。
{"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 的“結束”進行比較。
uj5u.com熱心網友回復:
考慮到輸入檔案的大小可能非常大,我覺得這不太合適。
這很奇怪。事實上,這正是正確的方法。錯誤的方法是閱讀整個內容。
唯一的例外是,如果單行本身可以是真正巨大的(比如說 128MB 或以上——那是……很長的一行)。
那是 JSON 格式,你需要一個 JSON 閱讀器。我建議杰克遜。
使用該行的結構創建一個類,大概類似于:
enum State {
start, end;
}
class Event {
String id;
State state;
long timestamp;
}
然后,讀取一行,讓 Jackson 將該行轉換為 Event 的一個實體,對其進行處理,然后重復,直到完成檔案。只要任何給定的行不是太長,這將允許您處理一個大小為許多 GB 的檔案。
如果單行長得離譜:嗯,JSON 并不是真正 為“流式傳輸”而設計的,因此大多數 JSON 庫都不會這樣做,或者至少不會讓它變得簡單。因此,我強烈建議您不要嘗試撰寫可以“流式傳輸”一行的內容,除非您確定確實需要這樣做。
這里唯一稍微復雜的事情是你需要記住最后讀取的條目,這樣你就可以在那個時候更新它的“花費時間”屬性,因為你只有在閱讀了正確條目之后的行后才能知道這一點。這是基本的編程。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481908.html
