我在 res/raw 中有一个自定义文件格式,这意味着它将在 APK 中被压缩。
假设我的应用程序安装在设备上。当我通过打开文件时openRawResource()
,它是否完全解压缩内存中的文件?
例如,如果它是一个 3MB 的文件,它会在内存中解压缩它吗?如果我只需要来自某个偏移量的 10KB 数据(并且我通过 到达它),它在调用BufferedInputStream.skip()
时还会消耗 3MB吗?openRawResource()
更新:除非我忽略了某些东西,否则它似乎并没有解压缩整个文件。考虑以下测试。
我在 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]);
}