1

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]);
}
4

2 に答える 2

0

その間、Androidメーリングリストで、DianneHackbornがこの質問に答えました。ダイアンの引用:

Gingerbreadを考える前は、メモリ内で完全に解凍し、使用するメモリの量に制限があり(1MBだと思います)、それを超えると開くことができなくなります。プラットフォームの現在のバージョンでは、サイズに制限なしで読み取ると、解凍がストリーミングされます。

私のテストはこれを確認します。ジンジャーブレッドICSデバイスでテストしたところ、正常に動作します。今後数日で、Froyo(Android 2.2)デバイスでもテストし、この投稿を更新します。

もちろん、ダイアンは確かに正しいと思いますが、彼女は「ジンジャーブレッド」がサポートされている最初のバージョンだと思っているので、フローズンヨーグルトでテストしても問題ありません。

PS:ダイアンの答えを見つけてくれたCommonsWareに感謝します。

于 2012-08-21T22:51:52.073 に答える
0

はい、すべての「圧縮可能な」ファイルは圧縮されています。「非圧縮」ファイルとは、すでに圧縮された形式であり、圧縮の恩恵を受けない特定の画像ファイル、zipファイルなどです。

1Mを超えるファイルがある場合、圧縮が問題になる可能性があることに注意してください。ファイルは正常に圧縮され、Androidツールキットは問題なくパッケージ化しますが、電話では1Mを超えるファイルの解凍を拒否するため、ファイルを取得しようとするとエラーが発生します。この回避策は、ファイルにjpgなどの拡張子を付けて、圧縮されないようにすることです。

于 2012-08-21T22:25:12.230 に答える