Byte 和java.lang.OutOfMemoryError按位读取文件

我正在尝试编写一个按位读取文件的阅读器,但我对大文件有问题。 我尝试用100 mb读取文件,花了3分钟但它确实有效。

然而,然后我尝试了500 MB的文件,但它甚至没有开始。 因为这条线:

byte[] fileBits = new byte[len]; 

现在我正在寻找苏打,找不到任何东西。 也许有人解决了它,可以分享一些代码,提示或想法。

 if (file.length() > Integer.MAX_VALUE) { throw new IllegalArgumentException("File is too large: " + file.length()); } int len = (int) file.length(); FileInputStream inputStream = new FileInputStream(file); try { byte[] fileBits = new byte[len]; for (int pos = 0; pos < len;) { int n = inputStream.read(fileBits, pos, len - pos); if (n < 0) { throw new EOFException(); } pos += n; } inputStream.read(fileBits, 0, inputStream.available()); inputStream.close(); 

我建议你尝试内存映射。

 FileChannel fc = new FileInputStream(file).getChannel(); MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, (int) fc.size()); 

这将使整个文件几乎立即可用(大约10毫秒)并且使用旁边没有堆。 BTW文件必须小于2 GB。

如果您确实需要立即将整个文件加载到内存中,我只能建议增加Java可用的内存。 尝试使用Xmx (最大堆大小)或Xms (初始堆大小)参数调用您的程序(如果您事先知道需要多少内存,请使用后者,否则前者可能是最好的)。

 java -Xms512m -Xmx1g BigApp 

作为替代方案,您可以使用NIO的内存映射文件 。

您不应该将整个文件打开到内存中。 您需要创建一个固定大小的字节数组缓冲区,然后从您定义的大小的块中打开文件。

我建议你使用RandomAccessFile