openRawResource:APK中的压缩文件是否完全解压缩?

时间:2012-08-21 20:49:39

标签: android inputstream apk

我在res / raw中有自定义文件格式,这意味着它将在APK中压缩。

假设我的应用程序已安装在设备上。当我通过openRawResource()打开文件时,它是否完全解压缩内存中的文件?

E.g。如果它是一个3MB的文件,它会在内存中解压缩吗?如果我只需要来自某个偏移的10KB数据(并且我通过BufferedInputStream.skip()到达它),那么在调用openRawResource()时它仍会消耗3MB吗?

更新:除非我忽略了某些内容,否则它似乎没有解压缩整个文件。考虑以下测试。

我向res / raw添加了一个30MB的随机数据文件。它的扩展名不是ogg,mp3,png或类似的,所以它将在APK中压缩。在下面的代码中,我寻求大约19MB的位置,并阅读cca。从文件117KB。即使未压缩长度为30MB,它也能正常工作。 (据我所知,1MB限制仅适用于资产,而不适用于原始资源。)

is = context.getResources().openRawResource(R.raw.test); // test is a 30MB test.txt
DataInputStream dis = new DataInputStream(new BufferedInputStream(is, 8192));


dis.skip(19555125);
byte[] testArr = new byte[117412];
dis.readFully(testArr);
for (int i = 0; i < testArr.length - 117000; i++) {
    Log.w("LOG_TAG", "" + testArr[i]);
}

2 个答案:

答案 0 :(得分:0)

是的,所有“可压缩”文件都是压缩的。 “不可压缩”文件 是某些已存在的图像文件,zip文件等 压缩形式,不会受益于压缩。

请记住,如果文件较大,压缩可能会成为问题 超过1M。该文件将压缩正常,Android工具包将 愉快地打包它,但在电话上它会给你一个错误 尝试检索它,因为手机拒绝解压缩文件 大于1M。解决方法是给文件一个 jpg或某些此类的扩展,因此它不会被压缩

答案 1 :(得分:0)

与此同时,在Android邮件列表中,Dianne Hackborn回答了这个问题。 引用黛安娜:

  

在我认为姜饼之前,它会在内存中完全解压缩   限制它将使用的内存量(我认为1MB)   哪个开放会失败。在平台的当前版本上   解压缩时会进行流式处理,但不限制大小。

我的测试证实了这一点。我刚刚在 Gingerbread ICS 设备上进行了测试,它运行正常。在接下来的几天里,我将在 Froyo (Android 2.2)设备上进行测试,并将更新此帖子。

当然,Dianne当然是对的我肯定,但她说她认为“Gingerbread”是第一个支持它的版本,所以我会在Froyo上测试它并不会受到伤害。

P.S。:感谢CommonsWare发现Dianne的答案。