res / rawのカスタムファイル形式があります。これは、APKで圧縮されることを意味します。
アプリケーションがデバイスにインストールされていると仮定します。を介してファイルを開くopenRawResource()
と、メモリ内のファイルが完全に解凍されますか?
たとえば、3MBのファイルの場合、メモリ内で解凍されますか?特定のオフセットから10KBのデータのみが必要な場合(そして経由で到達する場合)、が呼び出されBufferedInputStream.skip()
たときに3MBを消費しますか?openRawResource()
更新:何かを見落としている場合を除いて、ファイル全体が解凍されているようには見えません。次のテストを検討してください。
ランダムデータの30MBファイルをres/rawに追加しました。その拡張子はogg、mp3、pngなどではないため、APKで圧縮されます。以下のコードでは、19MB程度の位置を探し、ccaを読み取ります。ファイルから117KB。また、非圧縮の長さは30MBですが、機能しました。(私が読んだ限りでは、1MBの制限はアセットにのみ適用され、rawリソースには適用されません。)
is = context.getResources().openRawResource(R.raw.test); // test is a 30MB test.txt
DataInputStream dis = new DataInputStream(new BufferedInputStream(is, 8192));
dis.skip(19555125);
byte[] testArr = new byte[117412];
dis.readFully(testArr);
for (int i = 0; i < testArr.length - 117000; i++) {
Log.w("LOG_TAG", "" + testArr[i]);
}