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

Android openRawResource:APK中的压缩文件是否完全解压缩?,android,inputstream,apk,Android,Inputstream,Apk,我有一个res/raw格式的自定义文件,这意味着它将在APK中被压缩 假设我的应用程序安装在设备上。当我通过openRawResource打开文件时,它是否会完全解压缩内存中的文件 例如,如果是3MB文件,它会在内存中解压吗?如果我只需要某个偏移量的10KB数据,并通过BufferedInputStream.skip访问它,那么调用openRawResource时它还会消耗3MB吗 更新:除非我忽略了某些内容,否则它似乎并没有解压缩整个文件。考虑下面的测试。 我向res/raw添加了一个30MB

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

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

例如,如果是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]);
}

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

请记住,如果文件较大,压缩可能是个问题 超过100万。文件将被很好地压缩,Android工具包将 很高兴将其打包,但在电话中,当您 尝试检索它,因为手机拒绝解压缩文件 大于1米。解决方法是为文件提供一个
jpg或类似的扩展,因此不会被压缩。与此同时,在Android邮件列表上,Dianne Hackborn回答了这个问题。 引用Dianne的话:

在我想到姜饼之前,它会在记忆中完全解压 在内存量有限制的情况下,我认为它会使用1MB以上的内存 公开赛会失败。在平台it的当前版本上 解压在阅读时以流式传输,大小不受限制

我的测试证实了这一点。我刚刚在姜饼和ICS设备上测试过,效果很好。在接下来的几天里,我将在Froyo Android 2.2设备上测试它,并将更新这篇文章

当然,Dianne肯定是对的,但她说她认为姜饼是第一个支持它的版本,所以我会在Froyo上测试它不会有什么坏处


注:感谢Commonware找到了Dianne的答案。

谢谢,尽管我没有问谁被压缩了,谁没有读你的第一句话,但看起来你是这么认为的。当我打开这样一个压缩文件的输入流时,我问Android是否将整个文件解压缩到内存中。我用我的测试代码更新了我的原始帖子。json文件被压缩了吗?当从IDE运行应用程序时,文件会被压缩吗?没有签名,这意味着调试模式?Dianne Hackborn在android开发者谷歌小组上回答了这个问题:Good spot。在写这篇文章之前,我一直在检查这个列表:我现在要添加一个回复帖子。APK文件会被压缩吗,即使在调试模式下,也不会被签名?Dianne Hackborn的评论来源在哪里?