2017-02-20 559 views
3

我有一個帶有10億數字pi的.txt文件。我在文件中讀取了一個字符串,但是我得到一個OutOfMemoryError。它與1個MIllion數字合作。我將字符串保存爲char []數組。 當我在整個數組中循環時,是否有可能以某種方式流式傳輸.txt文件?我只需要一種方法來以數組的形式訪問所有10億位數。閱讀巨大的文本文件Java

+3

什麼樣的處理你需要讀取的數據呢? – Berger

+0

我正在循環查看整個字符數組以尋找特定的數字...所以只需通過數組循環。多數民衆贊成在 – Steakie

+0

你是什麼意思的「尋找一定數量」?數字是pi。你的意思是「尋找特定的數字序列」?如果是這樣,多少位數? –

回答

4

有由於Java 1的FileReader的BufferedInputStream與

public int read(char cbuf[], int offset, int length) throws IOException 

我建議你從那裏開始

+0

這可能是我的問題的解決方案。遇到問題實施.. .._。生病繼續嘗試 – Steakie

+0

好吧,想通了,thx很多:) – Steakie

+0

'BufferedInputStream'的相關性在哪裏? – Holger

0

這不僅是可能的:它既是極力推薦,並在實踐完成。通常做的是重用與Java庫(InputStream等)相同類型的接口。

在這種情況下,這可能意味着一個新的IntegerInputStream類,它將數字輸出爲流。這個班本身可以將呼叫轉移到FileInputStream。在內部,您可以使用char []數組來存儲緩衝區並提高性能,或者按照Pavel的建議通過BufferedInputStream指定呼叫,但最好將消費者與內部緩衝區管理隔離開,並保持適當的抽象級別以供使用大小寫(pi的小數點)。

0

您可以使用FileInputStream打開文件,然後以byte []爲單位讀取它以避免OOMError。

0

根據文檔

你應該能夠得到長度的字符串Integer.MAX_VALUE的(總是2147483647(231 - 1)由Java說明書中,陣列的最大尺寸,這String類使用內部存儲)或一半的最大堆大小(因爲每個字符是兩個字節),取其較小者

這就是爲什麼你得到的異常,

,如果你不真正需要的全1B字符。您可以嘗試使用不會將整個內容加載到內存中的緩衝區。

BufferedReader br = new BufferedReader(new FileReader(new File("path to file"))); 
char[] data=new char[1000000] ;//however many chars you want; 
int i=0; 
while ((c = br.read()) != -1 && i<data.length) { 
    data[i++]= c; 
} 

br.close(); 
+0

爲什麼地球上你讀最多1000000單個字符,而不是在讀者上調用read(char [])' ?然後,你不需要'BufferedReader'來解決過多的'read()'調用...... – Holger

+0

@Holger我想這是另一種方式。就複雜性而言,兩種解決方案應該大致相同。但是我同意一個班輪解決方案更好 – nafas