安卓 2.2 : best way to read small blocks of binary data from big files?

标签 android performance memory-management binaryfiles

我正在为 Android 2.2 开发。

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

问题一:

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

我看到两个解决方案:

  1. (hack) 使用 mp3 或 png 扩展;但我不确定这是否允许内存高效访问(即 inputstream.skipbytes 等)
  2. 安装后,在第一次启动应用程序时,应用程序会将文件复制到它自己的可写工作文件夹(在 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/

相关文章:

iphone - iOS内存管理跟进。 dealloc 与零?

c++ - C++中的delete和调用析构函数有什么区别

android - 在 Android 中膨胀类 Button 时出错

Android 单选项目对话框

java - 回收站 View + 卡片 View : Inflating Wrong Data

performance - 软浮 ARM 上的 Qt 图形性能?

android - 如何在 Android 中保护我的加密 key ?

Android-当 "Profile GPU rendering"不适用于游戏应用程序时

c# - 解决链式计算的最快方法

检查 stdin 中读取的行格式为 number^number