先看看API的说明:

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

<strong><span style="font-size:18px;">注意:</span></strong>有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。   如果已经调用 close() 方法关闭了此输入流,那么此方法的子类实现可以选择抛出 IOException。   类 InputStream 的 available 方法总是返回 0。   <strong>此方法应该由子类重写。</strong>
返回:
可以不受阻塞地从此输入流读取(或跳过)的估计字节数;如果到达输入流末尾,则返回 0。

但是在 FileInputStream中已经重写了这个方法,重写之后的方法是通过文件的描述来获取文件的大小的。

那么,我们来看看哪些地方可以用available()方法来获取文件大小,进而用来定义缓冲数组的长度。

1.在本地文件文件中,这里我一般是直接使用的。

2.网络中的文件

a.比如web 中http 里面的文件流里面,第一种情况有content-length,那么小文件的情况,我们是直接可以通过request 获取该属性,也就知道文件的大小了。

b.在某些情况下,比如文件比较大,采用采用分段方式,长连接的方式发送,不能一次知道文件大小,http 的header 里面就没有上面的content-length 属性,而是变成了Transfer-Encoding: chunked属性,这表示分段发送信息,但是对整个文件的接受,可以通过一些标志位,或者一些超时限制等方法处理,这里不具体研究了。

c.socket 传输文件,这玩意我看了下源码,是没重写available方法的,也就是说我们不能通过这个知道流的字节数,一般情况下,我们可以先发送一段自定义的header 过去,描述文件大小,然后再循环持续获取流信息。

available()方法的使用总结相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

    参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...

  4. IDEA中将代码块封装为方法,IDEA代码重构快捷键

    IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:

  5. IDEA自动生成对象所有set方法

    idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...

  6. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  7. java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解

    1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...

  8. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  9. Java Calendar.add()方法的使用,参数含义。指定时间差。

    cal.add()方法中的参数含义: 第一个参数如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作. 第 ...

  10. 设置select下拉框不可修改的→“四”←种方法

    设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...

最新文章

  1. IT服务台来电分配技术——ACD介绍
  2. C++ Primer 5th笔记(chap 17 标准库特殊设施)未格式化的输入/输出操作
  3. 端口号属于协议还是进程
  4. STM32 应用程序加密的一种设计方案
  5. 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
  6. Java word 内容读取
  7. 2017.5.7 能量项链 思考记录
  8. 《Lucene in Action》 MoreLikeThis 实例
  9. java-信息安全(九)-基于DH,非对称加密,对称加密等理解HTTPS
  10. python图形库使用教程_PySide——Python图形化界面入门教程(四)
  11. 004.麻雀虽小五脏俱全--最简单的JavaWeb
  12. Salesforce系列(十):Salesforce Schedule cron定时执行方法!
  13. 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
  14. ftp服务器下载,绿色版ftp服务器下载,以及ftp上传工具使用指南
  15. jvm中年轻代,老年代
  16. Java 中的屏幕共享
  17. 固建机器人建筑钢结构设备生产厂家一体化工作站,推动钢结构产业发展
  18. (五)少儿scratch编程第二课--第一个游戏练习,弹弹球
  19. Vue中实现父子组件的数据的双向绑定(vue.sync的用法)
  20. 学生HTML个人网页作业作品 HTML+CSS+JavaScript环保页面设计与实现制作

热门文章

  1. grep -A -B -C
  2. 请帮助和关心Unix-Center
  3. 青岛市中小学学籍系统服务器,全国各省市中小学学籍网登录入口
  4. 快速pow算法c语言_c语言pow(c语言中用pow算法求)
  5. 连续型随机变量单点概率为0以及不可能事件
  6. nRF51822 官方 Blinky 工程(多彩 LED)
  7. 一天搞懂机器学习PPT笔记-1
  8. 湛江景点旅游攻略!究竟有哪些你不容错过的景点?
  9. 科技美学引领行业发展:欧瑞博发布全新HomeAI操作系统
  10. python mro