获取outputstream大小_关于inputStream.available()方法获取下载文件的总大小

2023-11-12

如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调用这个函数是在下载文件或者对文件进行其他处理时获取文件的总大小。

以前在我们初学File和inputStream和outputStream时,有需要将文件从一个文件夹复制到另一个文件夹中,这时候我们用的就是inputStream.available()来获取文件的总大小,而且屡试不爽。

但是当我们要从网络URL中下载一个文件时,我们发现得到的数值并不是需要下载的文件的总大小。

好吧。我们看看JDK文档中怎么解释。

available

public int available()

throws IOException

返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。

注意,有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。

如果已经调用 close() 方法关闭了此输入流,那么此方法的子类实现可以选择抛出 IOException。

类 InputStream 的 available 方法总是返回 0。

此方法应该由子类重写。

返回:

可以不受阻塞地从此输入流读取(或跳过)的估计字节数;如果到达输入流末尾,则返回 0。

抛出:

inputStream 源代码

/**

* Returns the number of bytes that are available before this stream will

* block. This implementation always returns 0. Subclasses should override

* and indicate the correct number of bytes available.

*

* @return the number of bytes available before blocking.

* @throws IOException

* if an error occurs in this stream.

* @since Android 1.0

*/

public int available() throws IOException {

return 0;

}

这里返回的是 0 值。

所以说要从网络中下载文件时,我们知道网络是不稳定的,也就是说网络下载时,read()方法是阻塞的,说明这时我们用

inputStream.available()获取不到文件的总大小。

但是从本地拷贝文件时,我们用的是FileInputStream.available(),难道它是将先将硬盘中的数据先全部读入流中?

然后才根据此方法得到文件的总大小?

好吧,我们来看看FileInputStream源代码吧

/**

* Returns the number of bytes that are available before this stream will

* block. This method always returns the size of the file minus the current

* position.

*

* @return the number of bytes available before blocking.

* @throws IOException

* if an error occurs in this stream.

* @since Android 1.0

*/

@Override

public int available() throws IOException {

openCheck();

// BEGIN android-added

// Android always uses the ioctl() method of determining bytes

// available. See the long discussion in

// org_apache_harmony_luni_platform_OSFileSystem.cpp about its

// use.

return fileSystem.ioctlAvailable(fd.descriptor);

// END android-added

// BEGIN android-deleted

// synchronized (repositioningLock) {

// // stdin requires special handling

// if (fd == FileDescriptor.in) {

// return (int) fileSystem.ttyAvailable();

// }

//

// long currentPosition = fileSystem.seek(fd.descriptor, 0L,

// IFileSystem.SEEK_CUR);

// long endOfFilePosition = fileSystem.seek(fd.descriptor, 0L,

// IFileSystem.SEEK_END);

// fileSystem.seek(fd.descriptor, currentPosition,

// IFileSystem.SEEK_SET);

// return (int) (endOfFilePosition - currentPosition);

// }

// END android-deleted

}

这里重写了inputStream中的available()方法

关键是:fileSystem.ioctlAvailable(fd.descriptor);

调用了FileSystem这是java没有公开的一个类,JavaDoc API没有。

其中

fileSystem 是一个IFileSystem对象,IFileSySTEM是java没有公开的一个类,JavaDoc API中没有;

fd是一个FileDescriptor对象,即文件描述符

说明这句代码应该是通过文件描述符获取文件的总大小,而并不是事先将磁盘上的文件数据全部读入流中,再获取文件总大小

搞清楚了这些,但是我们的主要问题没有解决,怎么获得网络文件的总大小?

我想原理应该都差不多,应该也是通过一个类似文件描述符的东西来获取。

网络下载获取文件总大小的代码:

HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();

httpconn.getContentLength();

我们再来看看httpconn.getContentLength();

/**

* Gets the content length in bytes specified by the response header field

* {@code content-length} or {@code -1} if this field is not set.

*

* @return the value of the response header field {@code content-length}.

* @since Android 1.0

*/

public int getContentLength() {

return getHeaderFieldInt("Content-Length", -1); //$NON-NLS-1$

}

关键:getHeaderFieldInt("Content-Length", -1);

意思是从http预解析头中获取“Content-length”字段的值

其实也是类似从文件描述符中获取文件的总大小

分享到:

2011-04-25 20:00

浏览 70615

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取outputstream大小_关于inputStream.available()方法获取下载文件的总大小 的相关文章

  • Openmmlab(一)

    计算机视觉为研究如何自动理解图像和视频中的内容 运用于图像识别 人脸识别 计算机视觉应用 动漫特效 图像生成 风格迁移 虚拟主播 视频自动剪辑等 今日的计算机视觉 文字描述生成图片 视觉大模型 神经渲染CityNeRF 开源成为人工智能领域
  • js逆向webpack

    扣代码会遇到的基本2种形式 1 webpack function x 这里的x是存放模块1 模块2那个数组 function xx yy yy是存放模块1 模块2的数组下标 x yy call 模块参数1 模块参数2 模块参数3 必有一个加
  • 双系统ubuntu20.04(neotic版本)从0实现Gazebo仿真slam建图

    双系统ubuntu20 04 neotic版本 从0实现Gazebo仿真slam建图 昨晚完成了ROS的多机通讯 还没来得及整理相关操作步骤 在进行实际小车的实验之前 还是先打算在仿真环境中进行测试 熟悉相关的操作步骤 计划通过虚拟机 笔记
  • 【实验分享】CCIE—BGP反射器实验

    实验目的 l掌握BGP反射器的运行原理 l理解反射器的用途以及好处 实验说明 l通过此实验练习 可以灵活的使用BGP反射器 实验环境 l三台支持SPSERVICES的IOS的路由器 l直通线 实验拓扑 实验步骤 R1 config inte
  • alibaba fastjson jsonarray转list

    String avatar teacherEntity getAvatar if StringUtils isEmpty avatar List
  • Python——元类

    作者 小明 链接 https zhuanlan zhihu com p 30861351 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 什么是元类 理解元类 metaclass 之前 我们先了解下Pytho
  • 阿里云轻量级服务器部署网站 安装java+tomcat+Mysql

    网上关于部署服务器的教程已经是数不胜数 按理来说不应该重复造轮子 但是网上的教程没有很好的整合文章 于是乎笔者本着写一篇整合性 参考性比较强的角度出发写了这篇文章 本文详细写了阿里云轻量级服务器的安装jdk tomcat mysql部署简单
  • Window 10 系统 在命令行中输入python会跳转到商店问题解决

    在Windows 10 中配置了python的环境变量 但是在命令行中输入python会跳转到商店 这是由于在环境变量中path配置了 USERPROFILE AppData Local Microsoft WindowsApps 导致 只
  • 东北大学acm训练第五周

    include
  • mysql using filesort

    今天在explain一个MySQL的sql语句的时候 产生了 如下的结果 extra那一栏多了一个Using filesort 而却type也是ALL这说明了查询的结果是全表扫描 可是笔者明明就在 public time字段加了索引 然而笔
  • 只通过com.alibaba.fastjson.JSONArray实现okHttp下String转换JSONArray

    我的Android不能导入常见的那六个包 会严重报错 我改了很久很久还是不能解决错误 也就不能使用net sf包中的JSONArray 直接使用new JSONArray str 给像我一样不能导入包的同学介绍一种方法 import com
  • 浅谈 js reduce()

    reduce 为数组中的每一个元素依次 执行回调函数 不包括数组中被删除的元素或者未赋值的元素 接受四个参数 初始值 或者上次回调函数的返回值 当前元素值 当前索引 调用reduce的数组 语法 arr reduce function pr
  • 在电脑上安装虚拟机

    百度搜索一下 VMware Workstation 下载安装完成之后 找个破解码破解了即可 然后就下载对应的操作系统的iso文件 加载到虚拟机中即可
  • 进制数字的输入和输出

    写个程序 它读取一个整数并以二进制 八进制 和十六进制输出 以十六进制浮点数输出倒数 public class test1 public static void main String args 写个程序 它读取一个整数并以二进制 八进制
  • 免费公开课

    https www edx org course
  • 【Visual Studio】调试过程中VS卡死无响应

    最近在使用vs2022 debug调试过程中 经常出现vs2022直接卡死无响应 解决方案 第一种原因 是加载符号导致 调试 选项 符号 1 取消勾选 xxx 符号服务器 2 选择 仅加载指定的模块 第二种情况 VS卡死后 把崩溃dmp导出
  • 实时操作系统-与QNX比较-qnx系统优势-qnx性能分析-qnx系统性能分析

    锋影 e mail 174176320 qq com LynxOS QNX Linux的分析和比较 本文对四种实时操作系统 RTOS 特性进行分析和比较 它们是 Lynx实时系统公司的LynxOS QNX软件系统有限公司的QNX以及两种具有

随机推荐

  • 解决爬虫登陆电信密码加密问题

    遇见问题 写爬虫抓取电信数据 在登陆时发现密码加密问题 扒出加密函数如下 fn aesEncrypt function n var t CryptoJS MD5 login 189 cn i CryptoJS enc Utf8 parse
  • 使用kettle转换中的JavaScript对密码进行加密和解密

    日常开发中 为了确保账号和密码的安全 时常要对密码进行加密和解密 然而kettle是怎么对密码进行加密和解密的呢 下面的代码需要再转换中的JavaScript中运行 var encrypted password not encrypted
  • JDBC操作postgresql(javaweb)

    首先 postgresql的几个常见 语句结尾一定要加分号 语句结尾一定要加分号 语句结尾一定要加分号 如果是变量不要加引号 sql语句要加引号 1 常见命令 先进入安装的bin目录下 psql exe U postgres 连接数据库 h
  • linux:cloudflare证书申请及应用到nginx

    参考 免费申请网站SSL证书 有效期15年 全站开启https 哔哩哔哩 bilibili 总结 登陆www cloudflare com 注册账号 Add a Site 增加站点 站点设置完毕后Add record 记住这个Proxy s
  • JAVA之单元测试:Junit框架

    单元测试 单元测试就是针对最小的功能单元编写测试代码 Java程序最小的功能单元是方法 因此 单元测试就是针对Java方法的测试 进而检查方法的正确性 目前测试方法是怎么进行的 存在什么问题 1 只有一个main方法 如果一个方法的测试失败
  • BIP上传模版报错 SBL-EAI-04308

    问题 BIP里面上传模版时报如下错误 Siebel 1 0 Web 服务 的操作 SBL EAI 04308 IDS EAI WS OD FAULT 2 对象管理器错误 0 Web 服务 的操作 SBL EAI 04308 IDS EAI
  • win10双屏锁屏后再登陆导致副屏窗口全部移到主屏的解决方法

    win10双屏锁屏后再登陆导致副屏窗口全部移到主屏的解决方法 其实是锁屏后屏幕关闭了 在重新打开时 会将所有窗口移动到主屏幕 解决方法 修改锁屏后屏幕关闭时间 具体请看http www xitongcheng com jiaocheng w
  • 字符串哈希

    字符串哈希 我们可以把一个字符串哈希处理成一个数字 具体做法 将字符串看作是一个p进制数 p大于字符的ascii码值 acbd哈希成数字是 a p 3 c p 2 b p 1 d p 0 modQ p一般取131或者13331 Q取2e64
  • Docker学习笔记

    五 Docker 1 简介 Docker是一个开源的应用容器引擎 是一个轻量级容器技术 Docker支持将软件编译成一个镜像 然后在镜像中各种软件做好配置 将镜像发布出去 其他使用者可以直接使用这个镜像 运行中的这个镜像称为容器 容器启动是
  • 微信小程序静态初步

    社团微信小程序 1 由于兴趣驱动 一直在学习微信小程序 由于之前一直学习Java 但是大三第一学期即将结尾 所以为了能让下学期的学习减少工作量所以就打算利用闲散时间开发小程序 于是就拿社团为例子 自己一步步摸索 现在只是初步学习 所以这些天
  • mysql-Innodb事务隔离级别-repeatable read详解(转)

    mysql Innodb事务隔离级别 repeatable read详解 转 一 事务隔离级别 ANSI ISO SQL标准定义了4中事务隔离级别 未提交读 read uncommitted 提交读 read committed 重复读 r
  • vim配置经典

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在终端 输入以下命令来编辑vimrc配置文件 sudo vim etc vim vimrc 或者 sudo gedit etc vim vimrc 将其复制粘贴进去 Des
  • GeoDa:入门基础

    前言 GeoDa是一个免费的开源软件工具 用于空间数据分析 它旨在通过探索和建模空间模式来促进数据分析的新见解 GeoDa是由Luc Anselin博士和他的团队开发的 该项目为探索性空间数据分析 ESDA 方法提供了用户友好的图形界面 例
  • mysql中join源码分析,MySQL中Join算法实现原理分析[图]

    在MySQL 中 只有一种 Join 算法 就是大名鼎鼎的 Nested Loop Join 他没有其他很多数据库所提供的 Hash Join 也没有 Sort Merge Join 顾名思义 Nested Loop Join 实际上就是通
  • 把二叉树转换成树(代码实现)

    前言 相信大家都知道二叉树如何转化成树 但是让你用代码实现 却发现自己无从下手 下面我将用代码实现 思想 树用二叉树来存储的话 那么类型是 左儿子 右兄弟 即二叉树某节点和它的左儿子在树中的关系也是父子关系 而与右儿子在树中的关系是兄弟关系
  • 机器视觉中非常好的github仓库

    AwesomeComputerVision Multi Object Tracking Paper List https github com SpyderXu multi object tracking paper list awesom
  • Oracle VM VirtualBox 不显示64位系统 linux 64 redhat 64

    打开BIOS里的虚拟化技术 修改bios中的virtualization 设为ENABLED
  • Elasticsearch 基本使用(三)条件查询

    条件查询 简单查询 term terms range match debug 查看分词结果 match phrase match phrase prefix match bool prefix multi match 复合查询 bool 查
  • 【c++之于c的优化 - 下】

    前言 一 inline 概念 以inline修饰的函数叫做内联函数 编译时C 编译器会在调用内联函数的地方展开 没有函数调用建立栈帧的开销 内联函数提升程序运行的效率 如果在上述函数前增加inline关键字将其改成内联函数 在编译期间编译器
  • 获取outputstream大小_关于inputStream.available()方法获取下载文件的总大小

    如果用inputStream对象的available 方法获取流中可读取的数据大小 通常我们调用这个函数是在下载文件或者对文件进行其他处理时获取文件的总大小 以前在我们初学File和inputStream和outputStream时 有需要