【发布时间】:2012-08-21 20:49:39
【问题描述】:
我在 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]);
}
【问题讨论】:
-
Dianne Hackborn 在 android-developers Google Group 上为这个问题的交叉帖子提供了答案:groups.google.com/group/android-developers/msg/5dcc314e771c697e
-
好地方。在写到这里之前,我一直在检查该列表:) 我现在将添加一个答案帖子。
标签: android inputstream apk