java - Byte[] 和 java.lang.OutOfMemoryError 逐位读取文件

标签 java file memory file-io

我正在尝试编写一个按位读取文件的阅读器,但我在处理大文件时遇到了问题。我尝试读取 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 毫秒)并且几乎不使用任何堆。顺便说一句,文件必须小于 2 GB。

关于java - Byte[] 和 java.lang.OutOfMemoryError 逐位读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9505025/

相关文章:

c - 在函数外释放内存会导致双重释放或损坏错误

java - 在没有变量的 if 语句中验证扫描仪用户输入

java - Cassandra 一致性级别规则

java.sql.DriverManager 无法识别 java.sql.Driver stub

c - 如何使用文件和 malloc 构造函数

php - 我应该取消设置我的 PHP 数组值吗?

matlab - 矩阵的值在其边缘周围平滑地下降到零

java - (Android)如何在我的音乐播放器上显示时间

java - SKIP_SIBLINGS 和 SKIP_SUBTREE 之间的区别

python - 如何评估文件是否已关闭?