阅读巨大的文本文件Java

时间:2017-02-20 16:40:24

标签: java stream text-files

我有一个十亿分之一秒的.txt。我在文件中读取一个字符串,但我得到一个OutOfMemoryError。它适用于1个MIllion数字。我将String保存为char []数组。 当我遍历整个数组时,是否有可能以某种方式流式传输.txt?我只需要一种方法来访问所有10亿个数字作为数组。

4 个答案:

答案 0 :(得分:4)

自java 1或FileReader以及

以来都有BufferedInputStream
public int read(char cbuf[], int offset, int length) throws IOException 

我建议你从那里开始

答案 1 :(得分:0)

这不仅是可能的:它强烈推荐并且在实践中完成。通常做的是重用与Java库(InputStream等)相同类型的接口。

在这种情况下,这可能意味着一个新的IntegerInputStream类,它将数字作为流输出。这个类本身可以将调用转发给FileInputStream。在内部,您可以使用char []数组来存储缓冲区并提高性能,或者像Pavel建议的那样通过BufferedInputStream进行调用,但最好将使用者与内部缓冲区管理隔离开来并保持适当的级别用例的抽象(pi的小数)。

答案 2 :(得分:0)

您可以使用FileInputStream打开文件,并按字节[]读取字节[]以避免OOMError。

答案 3 :(得分:0)

根据文件

  

你应该能够获得一个长度为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();