我正在尝试获取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()
方法返回的大小错误?
感谢您的帮助
答案 0 :(得分:1)
FileInputStream.getChannel()
documentation表示"返回与此流共享其位置的只读FileChannel。"您假设频道的开始和结束恰好位于文件的边界,这是其总size()
符合您预期的唯一方式,但文档不能保证
另请注意,FileInputStream.available()
不记录的意思与总大小相同 - 从技术上讲,它是可用的可用数据量需要从源加载/缓冲更多。除非整个源已经被读入内存,否则它几乎与实际文件大小无关。
我希望底层FileChannel
可以访问多个文件的大范围字节,例如所有资产组合(因此大尺寸),并且您需要引用{ {3}} getStartOffset()
和getLength()
方法可以了解相关文件在通道中的实际位置。我的猜测是AssetFileDescriptor.createInputStream()
给你一个已经知道位置和范围的对象,并为你处理。如果您要使用原始频道,请遵守文件描述符中的信息。另请注意,根据文档,如果您移动FileInputStream
的位置(例如,通过读取字节),那么您也同时移动通道的位置,所以如果您正在尝试,请小心同时使用两者。