1

我正在开发一个使用 AES 加密对媒体(图片、视频等)进行加密的 Android 应用程序,java.lang.OutOfMemoryError当我读取大文件(例如超过 90 MB)时,我有:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileToEncrypt));
ByteBuffer bb = ByteBuffer.allocate((int) fileToEncrypt.length());
bis.read(bb.array());
bis.close();

根据thisthis主题或其他,我正在使用android:largeHeap="true"AndroidManifest.xml中的选项,但我不确定这是最好的解决方案。是吗 ?如果不是,那么操作大文件的最佳方法是什么?

4

1 回答 1

1

android:largeHeap 标志有潜在危险,我不会向任何人推荐它。当您想尝试某些东西时这很好,但您不能依赖更大的堆作为最终解决方案。启用大堆可能会由于物理内存不足而导致意外崩溃,而不仅仅是此特定应用程序的 dalvik 内存不足。

对我来说有两种解决方案:

  • 内存映射文件。互联网上有很多关于 MMF 的资料。请参阅:http: //developer.android.com/reference/java/nio/channels/FileChannel.html您可以使用一些标准 NIO 类逐块读取文件。它会产生一种错觉,即您在内存中拥有整个文件。
  • 使用本机内存。请参阅:http ://code.google.com/p/native-buffer/使用 NDK 您可以访问整个 RAM。问题是您必须以 C 风格管理内存。
于 2013-02-25T14:37:36.767 回答