从InputStream读取时发生IOException

时间:2009-08-13 17:03:47

标签: java android inputstream ioexception

在从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 个答案:

答案 0 :(得分:14)

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

IIRC,这个问题来自于尝试访问在构建APK时压缩的文件。

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

答案 1 :(得分:3)

将文件扩展名更改为 .mp3 以避免文件压缩确实有效,但应用的APK要大得多(在我的情况下为2.3 MB而不是0.99 MB)。

还有其他方法可以避免这个问题吗?

这是我的答案: Load files bigger than 1M from assets folder

答案 2 :(得分:2)

您可以使用GZIP为自己压缩文件并使用GZIPInputStream类解压缩。

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

答案 3 :(得分:0)

你是对的,因为提取文件有一定的大小限制。您可能希望将较大的文件拆分为1MB的文件,并使用一种方法来了解哪些文件是由哪些文件组成的,在应用程序运行时将它们再次拼接在一起。