Android 2.2:从大文件中读取小块二进制数据的最佳方法?

时间:2011-12-15 09:28:05

标签: android performance memory-management binaryfiles

我正在为Android 2.2开发。

默认情况下,放入资源和资产的内容会在APK中压缩,除非它们的扩展名表明它们已经被压缩(mp3,png)。此外,在Android 2.3之前,对于资产,您只能放置大小小于1 MB的未压缩文件。

问题1:

如果我将1.5MB二进制文件放入res / raw,并且我的程序用它的标准Android ID(R.raw .....)引用它,那么系统会将整个文件拉入存储器?由于1.5MB以压缩方式存储,我认为必须这样做。这是令人不愉快的,因为程序可能只需要从给定的文件偏移量加载1KB的数据。这会对应用程序性能/速度产生严重影响。

我看到两个解决方案:

  1. (hack)使用mp3或png扩展名;但我不确定这是否允许内存高效的访问(即inputstream.skipbytes等)
  2. 安装完成后,应用程序首次启动时,应用程序会将文件复制到自己的可写工作文件夹(在SD卡中)。从那时起,它将始终从那里访问文件而不是R.raw ...方式。因此,顺序读取肯定会起作用,即内存使用量不会超过从指定文件偏移量读取的实际数据(除了inputstream.seek实现使用的临时读取缓冲区,这是很好的优化,即我认为很小) )。
  3. 问题2:

    从大文件中有效读取二进制数据内存的最佳方法是什么?我不想将我的大文件拆分成许多小文件,除非这是唯一的方法。

2 个答案:

答案 0 :(得分:1)

我选择#2解决方案然后使用RandomAccessFile来避免线性访问。

答案 1 :(得分:1)

我也会选择解决方案#2,但我不使用随机访问文件,而是使用java.nio.MappedByteBuffer - 这样你就可以获得带字节缓冲区语义的快速随机访问。