2009-08-13 52 views
10

从Android平台上的InputStream中读取时,我遇到了一个奇怪的问题。我不确定这是一个Android特定的问题,还是我一般做错的事情。从InputStream中读取时出现IOException

是Android的特定的唯一事情是这样调用:

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

这将返回的InputStream从Android的资产的文件。不管怎么说,这里就是我碰到的问题:

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

当读()执行它抛出IOException异常。奇怪的是,如果我做两个连续的单字节读取(或任何数量的单字节读取),没有例外。在例子中,这个工程:

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

任何想法,为什么两个连续的单字节读取工作,但一个调用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字节)它工作正常。有超过一定大小的文件有问题吗?

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

+0

1MB的文件工作,但一个1.5MB的文件都没有。资产是否有一定的规模限制? – DJayC

回答

14

(我的岗位到Android开发人员没有显示出来,所以我会尽力在这里重新张贴它)

IIRC,这个问题来自于试图访问被压缩为建设APK的一部分文件。

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

+1

你是对的。将扩展名重命名为.MP3。这是一个愚蠢的错误,并且应该有办法告诉它不要压缩某个文件,如果它会导致这种类型的问题。 谢谢 – DJayC

+0

@ CommonsWare:有没有其他方法从资产中读取压缩文件?我的意思是文件在打包到APK时被压缩,但是我们可以读取资产文件? – VSB

0

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

3

将文件扩展名更改为.mp3以避免文件压缩功能无法正常工作,但该应用的APK功能要大得多(在我的情况下为2.3 MB而不是0.99 MB)。

是否有其他方法可以避免此问题?

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

相关问题