我正在尝试获取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()方法返回的大小是错误的?
谢谢你的帮忙
发布于 2014-04-18 05:08:28
FileInputStream.getChannel() 文档表示,它“返回一个与此流共享位置的只读FileChannel”。您假设通道的开始和结束完全在文件的边界上,这是它的总size()与您期望的完全匹配的唯一方法,但是文档并不能保证这一点。
还请注意,FileInputStream.available()是,而不是,它的意思与总大小相同--从技术上讲,它是可以读取的数据量,而不需要从源加载/缓冲更多的数据。除非整个源代码已经读取到内存中,否则它可能与实际的文件大小几乎没有任何关系。
我希望底层FileChannel能够访问多个文件的大量字节,比如所有资产的总和(因此是大的),您需要引用AssetFileDescriptor的getStartOffset()和getLength()方法来知道相关文件的字节在通道中的实际位置。我的猜测是,AssetFileDescriptor.createInputStream()给了你一个已经知道位置和范围的对象,并为你处理这个问题。如果要使用原始通道,那么请遵守文件描述符中的信息。还请注意,根据文档,如果您移动FileInputStream的位置(例如,通过读取字节),那么您也同时移动通道的位置,因此如果您试图同时使用这两种方法,请小心。
https://stackoverflow.com/questions/22020604
复制相似问题