Java 获取错误的文件通道大小

Java 获取错误的文件通道大小,java,android,filechannel,Java,Android,Filechannel,我正在尝试获取资产中包含的文件的大小。 我正在使用FileChannel,因为我以后需要FileChannel。 文件myfile.txt包含7个字节 这是我的密码: AssetManager amgr; AssetFileDescriptor afd; FileChannel fchIn; FileInputStream fis; amgr=context.getAssets(); afd=amgr.openFd("myfile.txt"); fis=afd.createInputStrea

我正在尝试获取
资产中包含的文件的大小。
我正在使用
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()
方法返回的大小不正确


感谢您的帮助。

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

还要注意的是,没有被记录为与总大小的意思相同——从技术上讲,它是不需要从源中加载/缓冲更多数据就可以读取的数据量。除非整个源代码已经读入内存,否则它可能与实际文件大小几乎没有任何关系


我希望底层的
FileChannel
可以访问多个文件的大范围字节,就像您的所有资产组合一样(因此是大的大小),并且您需要引用的
getStartOffset()
getLength()
了解通道中关联文件字节的实际位置的方法。我猜,
AssetFileDescriptor.createInputStream()
将为您提供一个对象,该对象已经知道位置和范围,并为您处理该位置和范围。如果您要使用原始通道,请遵守文件描述符中的信息。另请注意,根据文档,如果移动
文件输入流的位置(例如通过读取字节),则同时移动通道的位置,因此,如果您尝试同时使用这两种方法,请小心。

如果您尝试自己打开文件,而不是使用
Asset*
API,该怎么办?我想我必须使用Asset*来访问assets文件。除了使用AssetManager还有其他方法吗?天哪,谢谢!我没有在文档中找到对这种行为的描述,在找到你的评论之前,我感到非常震惊。