首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取错误的FileChannel大小

获取错误的FileChannel大小
EN

Stack Overflow用户
提问于 2014-02-25 16:42:08
回答 1查看 1.3K关注 0票数 3

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

这是我的代码:

代码语言:javascript
复制
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());

产出如下:

代码语言:javascript
复制
7237492
7

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

谢谢你的帮忙

EN

回答 1

Stack Overflow用户

发布于 2014-04-18 05:08:28

FileInputStream.getChannel() 文档表示,它“返回一个与此流共享位置的只读FileChannel”。您假设通道的开始和结束完全在文件的边界上,这是它的总size()与您期望的完全匹配的唯一方法,但是文档并不能保证这一点。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22020604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档