使用 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 的帮助!
我需要从我的应用程序的 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 underlyingParcelFileDescriptor.AutoCloseInputStream
depending on whether the the object represents a complete file or sub-section of a file.
缺乏对整体情况和文档的理解让我对使用这种方法感到不安。
我是否应该担心 AssetFileDescriptor.createInputStream
读取大文件(超过 1mb)时的行为?读取资产文件时使用Channels
是否安全?
提前致谢!
最好的处理资产的方法是将它们复制到内部或外部存储,然后用任何你想要的方式读取它们。 感谢@pskink 的帮助!