![](/img/trans.png)
[英]How to read a large file of Strings in chunks, each time from different offset, in 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.