能否使用InputStream.available()计算文件大小?选InputStream还是ParcelFileDescriptor?
文件大小计算相关问题解答
1. 能否使用InputStream.available()方法计算文件大小?
绝对不行。available()的作用是返回当前输入流可以无阻塞读取的字节数,并非文件的总大小。比如网络流、压缩流这类非本地文件流,它只能返回当前缓存里的字节数,和实际总大小完全不符;就算是本地文件的FileInputStream,虽然某些场景下可能碰巧返回总大小,但这并不是API的规范行为,换个环境或流实现就会出错,完全不能用来计算文件总大小。
2. 我应当使用InputStream还是ParcelFileDescriptor来计算文件大小?已知InputStream的速度比ParcelFileDescriptor更快。
首先得明确:如果只是为了获取文件大小,ParcelFileDescriptor.getStatSize()才是靠谱的选择,而且效率一点不低——它直接读取文件系统的元数据,根本不需要打开流读取内容。
你说InputStream速度更快,但那是针对读取文件内容的场景,而这里是计算文件大小。用available()拿大小本身就是错误的,哪怕速度再快,结果不对也毫无意义。如果你的业务里已经打开了InputStream用来读文件,同时需要获取大小,那最好还是通过ParcelFileDescriptor或者File类的length()方法来获取,别依赖available()。
两种实现代码
public static long get_file_size_using_stream(InputStream is) { return is.available(); } public static long get_file_size_using_pdf(ParcelFileDescriptor pfd) { return pfd.getStatSize(); }
内容的提问来源于stack exchange,提问作者drj
相关产品推荐
相关产品推荐

