从文件中读取字节时出现 OutOfMemoryException

OutOfMemoryException when reading bytes from file

我正在尝试制作一个十六进制转储应用程序,为此,我需要读取文件字节。我正在使用 apache io 版本 2.8.0 进行十六进制转储。这是我正在使用的代码:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            try {
                byte[] bytes = Files.readAllBytes(Paths.get(getPackageManager().getApplicationInfo("com.pixel.gun3d", 0).nativeLibraryDir.concat("/libil2cpp.so")));
                Log.e("MainActivity", dumpHex(bytes));
            } catch (PackageManager.NameNotFoundException | IOException e) {
                e.printStackTrace();
            }
        }

    private String dumpHex(byte[] bytes) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            HexDump.dump(bytes, 0, out, 0);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(out.toByteArray());
    }

我得到的错误是:java.lang.OutOfMemoryError: Failed to allocate a 155189264 byte allocation with 25165824 free bytes and 94MB until OOM, max allowed footprint 328602112, growth limit 402653184 我查了一下,none 我尝试过的建议(例如将 android:largeHeap="true"android:hardwareAccelerated="false" 添加到清单中)奏效了。感谢您的帮助 <3

读取文件时,建议将读取分成小块以避免此类错误。 将整个文件字节读入字节数组有限制,例如文件大小超过 Integer.MAX_VALUE 你将得到一个 OutOfMemoryException。

尝试做类似的事情:


byte[] buffer = new byte[1024];
FileInputStream fis = new FileInputStream(file);
int readBytesNum = fis.read(buffer);
while (readBytesNum > 0)
{
    //do what you need
    readBytesNum = in.read(buffer);
}

这意味着您需要更改 HexDump 的实现以处理分区中的文件