【发布时间】:2012-03-19 06:53:55
【问题描述】:
我正在尝试编写一个按位读取文件的阅读器,但我遇到了大文件的问题。我尝试读取 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();
【问题讨论】:
-
您真的需要一次完整的文件吗?是什么阻止您流式传输?
-
你试过searching 换
OutOfMemoryError吗?见java -mx -
您创建的每个索引都是 4 个字节。其中 5 亿将尝试分配 2G 的空间。如果没有更多内存或 josh.trow 建议的缓冲区/流式处理,您无法以这种方式解决它
-
当我们的应用程序内存不足时,对我们有用的解决方案是使用具有 96GB RAM(带有适当的 -XMx 选项)而不是 24GB 的机器.. :D.. 说真的,尽管回答什么乔希说..
-
@JohnVint 创建
byte数组如何使用每个索引超过一个字节?