3

我正在尝试获取包含在assets. 我正在使用a FileChannel,因为我需要FileChannel稍后。该文件myfile.txt包含 7 个字节。

这是我的代码:

AssetManager amgr;
AssetFileDescriptor afd;
FileChannel fchIn;
FileInputStream fis;

amgr=context.getAssets();
afd=amgr.openFd("myfile.txt");
fis=afd.createInputStream();
fchIn=fis.getChannel();

Log.d("mytag", fchIn.size());
Log.d("mytag", fis.available());

输出是:

7237492
7

为什么方法返回的大小FileChannel.size()错误?

谢谢你的帮助

4

1 回答 1

1

FileInputStream.getChannel() 文档说它“返回一个与该流共享其位置的只读 FileChannel。” 您假设通道在您的文件边界处开始和结束,这是其总数size()符合您期望的唯一方式,但文档并不能保证

另请注意,FileInputStream.available()没有记录到与总大小相同的意思——从技术上讲,它是无需从源加载/缓冲更多数据即可读取的数据除非整个源代码已经读入内存,否则它可能与实际文件大小几乎无关。

我希望底层可以访问多个文件的大范围字节,就像你所有的资产组合(以及大尺寸)一样,FileChannel你需要参考AssetFileDescriptor和方法来了解实际位置通道内关联文件的字节。我的猜测是给你一个已经知道位置和范围并为你处理好的对象。如果您要使用原始通道,请遵守文件描述符中的信息。另请注意,根据文档,如果您移动的位置(例如通过读取字节),那么您也会同时移动通道的位置,因此如果您尝试同时使用两者,请小心。getStartOffset()getLength()AssetFileDescriptor.createInputStream()FileInputStream

于 2014-04-18T05:08:28.813 回答