我正在为 Android 2.2 开发。
默认情况下,放入 res 和 Assets 的内容在 APK 中被压缩,除非它们的扩展名表明它们已经被压缩(mp3、png)。此外,在Android 2.3之前,对于assets,你只能放置大小小于1MB的未压缩文件。
问题一:
如果我将一个 1.5MB 的二进制文件放入 res/raw,并且我的程序使用其标准 Android ID (R.raw.....) 引用它,那么系统会将整个文件拉入内存?由于 1.5MB 是以压缩方式存储的,我想它必须如此。这是令人不快的,因为程序可能只需要从给定的文件偏移量加载 1KB 的数据。这会对应用性能/速度产生严重影响。
我看到两个解决方案:
- (hack) 使用 mp3 或 png 扩展;但我不确定这是否允许内存高效访问(即 inputstream.skipbytes 等)
- 安装后,在第一次启动应用程序时,应用程序会将文件复制到它自己的可写工作文件夹(在 SD 卡中)。从这一点开始,它将始终从那里访问文件,而不是 R.raw... 方式。因此,顺序读取肯定会起作用,即内存使用量不会超过从指定文件偏移量读取的实际数据(除了 inputstream.seek 实现使用的临时读取缓冲区,这些缓冲区经过优化,我想很小) ).
问题2:
从大文件中有效读取二进制数据内存的最佳方法是什么?我不想将我的大文件拆分成许多小文件,除非这是唯一的方法。
最佳答案
我会选择 #2 解决方案,然后使用 RandomAccessFile
来避免线性访问。
关于安卓 2.2 : best way to read small blocks of binary data from big files?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8517813/