11

Android プラットフォームでInputStreamから読み取り中に奇妙な問題が発生しました。これが Android 固有の問題なのか、それとも一般的に間違っているのかはわかりません。

Android 固有の唯一のものは、次の呼び出しです。

InputStream is = getResources().openRawResource(R.raw.myfile);

これは、Android アセットからのファイルのInputStreamを返します。とにかく、ここで私は問題に遭遇します:

bytes[] buffer = new bytes[2];
is.read(buffer);

read() が実行されると、IOExceptionがスローされます。奇妙なことに、2 つの連続した 1 バイト読み取り (または任意の数の 1 バイト読み取り) を実行しても、例外はありません。例では、これは機能します:

byte buffer;
buffer = (byte)buffer.read();
buffer = (byte)buffer.read();

2 つの連続する 1 バイト読み取りが機能するのに、一度に両方を読み取るための 1 つの呼び出しが例外をスローする理由は何ですか? InputStreamは問題ないようです... is.available()100 万バイト以上を返します (当然のことです) 。

スタック トレースは、次の行の直前に次の行を示しますInputStream.read()

java.io.IOException
at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$800(AssetManager.java:36)
at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)

バッファ サイズを 1 バイトに変更しても、エラーがスローされます。バイト配列への読み取り時にのみ例外が発生するようです。

ファイルを 100,000 バイト (元のファイルは 1,917,408 バイト) に切り詰めると、正常に動作します。特定のサイズを超えるファイルに問題はありますか?

どんな助けでも大歓迎です!
ありがとう!

4

4 に答える 4

14

(android-developersへの投稿が表示されないので、こちらに再投稿してみます)

IIRC によると、この問題は、APK のビルドの一部として圧縮されたファイルにアクセスしようとしたことが原因で発生します。

したがって、この問題を回避するには、圧縮されないファイル拡張子を付けます。スキップされる拡張子のリストは忘れましたが、すでに圧縮されていることがわかっているファイル タイプ (たとえば、mp3、jpg) は機能する可能性があります。

于 2009-08-13T21:40:13.403 に答える
3

ファイル拡張子を.mp3に変更してファイル圧縮を回避することはできますが、アプリの APK ははるかに大きくなります (私の場合は 0.99 MB ではなく 2.3 MB)。

この問題を回避する他の方法はありますか?

私の答えは次のとおり です。アセットフォルダーから1Mを超えるファイルをロードします

于 2011-02-19T20:58:59.593 に答える
2

自分でファイルを GZIP で圧縮し、GZIPInputStream クラスで解凍できます。

http://developer.android.com/reference/java/util/zip/GZIPInputStream.html

于 2011-09-24T15:18:09.677 に答える
0

ファイルの抽出には特定のサイズ制限があるという点で、あなたは正しいです。大きなファイルを 1 MB の断片に分割し、どのファイルがどの断片で構成されているかを把握し、アプリの実行時にそれらを再びつなぎ合わせる方法が必要になる場合があります。

于 2009-08-13T21:28:23.243 に答える