首页 文章

从InputStream读取时发生IOException

提问于
浏览
10

我在从Android平台上的InputStream读取时遇到了一个奇怪的问题 . 我一般都做错了 .

唯一特定于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)

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

If I truncate the file to 100,000 bytes (file is: 1,917,408 bytes originally) it works fine. Is there a problem with files over a certain size?

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

4 回答

  • 3

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

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

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

  • 14

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

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

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

  • 0

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

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

  • 2

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

相关问题