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();

これまたはこのトピックまたは他のトピックによると、私android:largeHeap="true"はAndroidManifest.xmlのオプションを使用していますが、それが最善の解決策かどうかはわかりません。それは...ですか ?そうでない場合、大きなファイルを操作するのに最適なものは何ですか?

4

1 に答える 1

1

android:largeHeapフラグは潜在的に危険であり、誰にもお勧めしません。何かを試したい場合は良いのですが、最終的な解決策として大きなヒープに頼ることはできません。大きなヒープを有効にすると、この特定のアプリケーションのdalvikメモリが少ないだけでなく、物理メモリが少ないために予期しないクラッシュが発生する可能性があります。

私にとっては2つの解決策があります。

  • メモリマップトファイル。インターネットには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 に答える