获取错误的FileChannel大小

3

我正在尝试获取位于assets中的文件大小。 我使用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()方法返回的大小是错误的?

谢谢您的帮助。


如果您尝试自己打开文件而不是使用“Asset*”API会怎样? - fge
我认为我必须使用Asset*来访问资产文件。除了使用AssetManager之外,还有其他方法吗? - Vincent
1个回答

1

FileInputStream.getChannel() 文档 中说它“返回一个只读的 FileChannel,该通道与此流共享其位置。” 您假设通道恰好从文件边界开始和结束,这是总大小 size() 与您期望的相匹配的唯一方式,但文档不保证这一点。

还要注意,FileInputStream.available() 的含义并像总大小那样被记录 - 从技术上讲,它是可读取数据的数量,而无需从源中加载/缓冲更多数据。除非整个源已经被读入内存,否则它可能与实际文件大小几乎没有关系。

我期望底层的FileChannel可以访问多个文件的大量字节,比如你所有的资产合并在一起(因此大小很大),你需要引用AssetFileDescriptorgetStartOffset()getLength()方法来知道相关文件的字节在通道中的实际位置。我的猜测是AssetFileDescriptor.createInputStream()给你的是一个已经知道位置和范围并为你处理了这些的对象。如果你要使用原始通道,则要遵守文件描述符中的信息。还要注意,根据文档,如果你移动FileInputStream的位置(例如通过读取字节),那么同时也会移动通道的位置,所以如果你想同时使用两者,请小心。

哇,谢谢!我在文档中没有找到这种行为的描述,直到看到了你的评论才放心下来。 - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接