使用 FileChannel 读取 Android 资产文件是否安全?

Is it safe to read Android asset file with FileChannel?

我需要从我的应用程序的 asset 文件夹中读取二进制文件,我尝试这样做的方式是获取 Channel:

AssetFileDescriptor assetFd = context.getAssets().openFd("file.db");
FileChannel fileChan = assetFd.createInputStream().getChannel();

问题是 AssetManager, AssetFileDescriptor 的记录很差 类 并且行为方式不可预测(在我看来)。例如,如果您将尝试在上面的代码之后立即获取 fileChan.position(),您将不会得到 0,在我的例子中它将是 976。在深入了解 Whosebug 之后,我发现这是正常行为,您需要意识到资产被压缩成某种内部二进制形式并且 AssetFileDescriptor 不是真正的文件描述符。 在我的例子中,我有一个文件结构,其绝对字节位置存储在 header 中,因此似乎要正确读取它我还需要考虑 assetFd.getStartOffset().

此外,在阅读其文档后,我对方法 AssetFileDescriptor.createInputStream 行为的了解为零:

This will either return a full asset AssetFileDescriptor.AutoCloseInputStream, or an underlying ParcelFileDescriptor.AutoCloseInputStream depending on whether the the object represents a complete file or sub-section of a file.

缺乏对整体情况和文档的理解让我对使用这种方法感到不安。

我是否应该担心 AssetFileDescriptor.createInputStream 读取大文件(超过 1mb)时的行为?读取资产文件时使用Channels是否安全?

提前致谢!

最好的处理资产的方法是将它们复制到内部或外部存储,然后用任何你想要的方式读取它们。 感谢@pskink 的帮助!