2017-02-20 106 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