available()方法的使用总结
先看看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()方法的使用总结相关推荐
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程
参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...
- IDEA中将代码块封装为方法,IDEA代码重构快捷键
IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:
- IDEA自动生成对象所有set方法
idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...
- List元素互换,List元素转换下标,Java Collections.swap()方法实例解析
Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...
- java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解
1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...
- spring boot项目 中止运行 最常用的几种方法
spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...
- Java Calendar.add()方法的使用,参数含义。指定时间差。
cal.add()方法中的参数含义: 第一个参数如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作. 第 ...
- 设置select下拉框不可修改的→“四”←种方法
设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...
最新文章
- IT服务台来电分配技术——ACD介绍
- C++ Primer 5th笔记(chap 17 标准库特殊设施)未格式化的输入/输出操作
- 端口号属于协议还是进程
- STM32 应用程序加密的一种设计方案
- 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
- Java word 内容读取
- 2017.5.7 能量项链 思考记录
- 《Lucene in Action》 MoreLikeThis 实例
- java-信息安全(九)-基于DH,非对称加密,对称加密等理解HTTPS
- python图形库使用教程_PySide——Python图形化界面入门教程(四)
- 004.麻雀虽小五脏俱全--最简单的JavaWeb
- Salesforce系列(十):Salesforce Schedule cron定时执行方法!
- 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
- ftp服务器下载,绿色版ftp服务器下载,以及ftp上传工具使用指南
- jvm中年轻代,老年代
- Java 中的屏幕共享
- 固建机器人建筑钢结构设备生产厂家一体化工作站,推动钢结构产业发展
- (五)少儿scratch编程第二课--第一个游戏练习,弹弹球
- Vue中实现父子组件的数据的双向绑定(vue.sync的用法)
- 学生HTML个人网页作业作品 HTML+CSS+JavaScript环保页面设计与实现制作