簡體   English   中英

閱讀巨大的文本文件Java

[英]Reading huge textfiles Java

我有一個十億十億字節的.txt。 我在文件中讀取一個字符串,但我得到一個OutOfMemoryError。 它適用於1個MIllion數字。 我將String保存為char []數組。 當我遍歷整個數組時,是否有可能以某種方式流式傳輸.txt? 我只需要一種方法來訪問所有10億位數字作為數組。

自從java 1或FileReader以來就有BufferedInputStream

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

我建議你從那里開始

這不僅是可能的:它是強烈推薦和實踐中完成的 通常做的是重用與Java庫(InputStream等)相同類型的接口。

在這種情況下,這可能意味着一個新的IntegerInputStream類,它將數字作為流輸出。 該類本身可以轉發對FileInputStream調用。 在內部,您可以使用char []數組來存儲緩沖區並提高性能,或者像Pavel建議的那樣通過BufferedInputStream進行調用,但最好將使用者與內部緩沖區管理隔離開來並保持適當的抽象級別以供使用case(pi的小數)。

您可以使用FileInputStream打開文件,並按字節[]讀取byte []以避免OOMError。

根據文件

您應該能夠獲得長度為Integer.MAX_VALUE的字符串(Java規范始終為2147483647(231-1),數組的最大大小,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();

暫無
暫無

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

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