我在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]);
}
答案 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的答案。