我需要从我的应用中的asset
文件夹中读取二进制文件,而我尝试这样做的方式是获取Channel
:
AssetFileDescriptor assetFd = context.getAssets().openFd("file.db");
FileChannel fileChan = assetFd.createInputStream().getChannel();
问题是AssetManager, AssetFileDescriptor
是非常糟糕的文档类,并且以不可预测的方式表现(就像在我看来)。例如,如果您在上面的代码之后立即尝试获取fileChan.position()
,那么您将无法获得0,在我的情况下,它将是976.在深入了解StackOverflow之后,我发现它是'正常行为,你需要知道资产被压缩成一些内部二进制形式,AssetFileDescriptor
不是真正的文件描述符。
在我的情况下,我有一个文件结构,其中绝对字节位置存储在标题中,因此它似乎正确地读取它我还需要考虑assetFd.getStartOffset()
。
在阅读其文档后,我对方法AssetFileDescriptor.createInputStream
的行为一无所知:
这将返回完整资产
AssetFileDescriptor.AutoCloseInputStream
或基础ParcelFileDescriptor.AutoCloseInputStream
,具体取决于对象是代表文件的完整文件还是子部分。
缺乏对整个图片和文档的理解让我对使用这种方法感到紧张。
阅读大文件(超过1mb)时,我应该担心AssetFileDescriptor.createInputStream
行为吗?在阅读资产文件时使用Channels
是否安全?
提前谢谢!
答案 0 :(得分:0)
处理资产的最佳方法是将它们复制到内部或外部存储,然后使用您想要的任何方法读取它们。 感谢@pskink的帮助!