2014-11-21 34 views
-1

我正在構建歷史記錄解析器,這裏有一個應用程序已經完成了記錄任務(基於文本)。 既然我的主管想讓我創建一個應用程序來讀取該日誌。 該日誌是在月底產生,並在[日期]分隔:按特定字節拆分字節數組(字符)

[19-11-2014]
- 善有善報這裏
- 善有善報這裏

[20 -11-2014]
- 善有善報這裏
- 善有善報這裏

等等

如果日誌文件具有體積小,沒有任何問題生產工程過程通過DataInputStream獲取byte []的內容,並將其轉換爲String,然後執行篩選過程(通過執行子字符串等操作)。

但是,當文件的大小(大約100mb),它會引發JavaHeapSpace異常。我知道這是因爲內容的長度超過String maxlength,當我嘗試不將字節[]轉換爲字符串時,不會引發異常。

現在的問題是,如何將字節[]分成幾個字節[]? 這是一個新的字節[]僅包含單:

[日期]
- 善有善報這裏

因此,如果在一個月之內,我們在日誌9日,將它分成9個字節[] 。 拆分標記將基於[\\ d {2} - \\ d {2} - \\ d {4}],如果它是字符串,我可以使用Regex來查找所有標記,獲取indexOf和然後子串它。

但是,如何在不首先轉換爲字符串的情況下執行此操作?因爲它會拋出JavaHeapSpace。

+0

您可以修改執行日誌記錄任務的應用程序嗎?如果是這樣,它使用什麼日誌記錄系統? – jhamon 2014-11-21 14:55:41

+0

你可以使用具有固定大小的緩衝區進行部分解析嗎?我的意思是你可以讀取例如1024字節,然後讀取下一個1024等等。 – alexey28 2014-11-21 15:04:30

回答

0

我想這裏有幾個概念,你錯過了。

首先,InputStream是一個Stream,這意味着它是一個字節流。你對這個流程所做的事情取決於你,但是將所有的流保存到內存中完全違背了流構造的要點。

其次,DataInputStream用於讀取二進制文件中的對象,這些對象由DataOutputStream進行序列化。只讀一個字符串對於這種類型的Stream來說是過分的,因爲一個簡單的InputStream可以做到這一點。

至於你的具體問題,我會使用一個BufferedFileReader,並一次只讀一行,直到到達下一個日期。此時,您可以在讀取的最後一行內容上進行所需的任何處理,並釋放內存。因此不會遇到同樣的問題。