11

从Android 平台上的InputStream读取时,我遇到了一个奇怪的问题。我不确定这是否是特定于 Android 的问题,或者我做错了什么。

唯一特定于 Android 的是这个调用:

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

这将返回来自 Android 资产的文件的InputStream。无论如何,这就是我遇到问题的地方:

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

当 read() 执行时,它会抛出一个IOException。奇怪的是,如果我进行两次连续的单字节读取(或任意数量的单字节读取),也不例外。例如,这有效:

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

知道为什么两个连续的单字节读取有效,但一次调用一次读取两者会引发异常吗?InputStream似乎很好......返回超过一is.available()百万字节(应该如此)。

堆栈跟踪在以下行之前显示了这些行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)

将缓冲区大小更改为单个字节仍然会引发错误。看起来只有在读入字节数组时才会引发异常。

如果我将文件截断为 100,000 字节(文件最初为:1,917,408 字节),它工作正常。超过一定大小的文件有问题吗?

任何帮助表示赞赏!
谢谢!

4

4 回答 4

14

(我发给 android-developers 的帖子没有出现,所以我会尝试在这里重新发布)

IIRC,这个问题来自于尝试访问作为构建 APK 的一部分压缩的文件。

因此,要解决此问题,请为其提供一个不会被压缩的文件扩展名。我忘记了跳过哪些扩展名的列表,但已知已经压缩的文件类型(例如,mp3、jpg)可能有效。

于 2009-08-13T21:40:13.403 回答
3

将文件扩展名更改为.mp3以避免文件压缩确实有效,但应用程序的 APK 更大(在我的情况下为 2.3 MB 而不是 0.99 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

你是对的,因为提取文件有一定的大小限制。您可能希望将较大的文件拆分为 1MB 的片段,并有一种方法可以让您知道哪些文件由哪些片段组成,并在您的应用程序运行时将它们重新拼接在一起。

于 2009-08-13T21:28:23.243 回答