解决InputStream.available()获取流大小问题

 更新时间:2023年06月20日 16:46:38   作者:码农的进阶之路  
这篇文章主要介绍了解决InputStream.available()获取流大小问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

InputStream.available()获取流大小问题

近日在学习IOUtils时,模拟从网络上读取数据存放到本地磁盘,想使用InputStream.available()查看流的大小,结果发现得到的大小跟实际生成文件的大小不一致。

上代码:

InputStream in = new URL("http://www.apache.org").openStream();  
System.out.println(in.available()); 
FileOutputStream out = new FileOutputStream("F://1.html");  
//这里返回的i可以认为是流的大小
int i = IOUtils.copy(in, out); 
System.out.println(i);  
IOUtils.closeQuietly(out); 
IOUtils.closeQuietly(in); 

输出结果:

10660
60787

很显然,按照我们之前的理解,这两个输出得到的数据应该是一样的。后一个输出的文件大小是没有问题的,写入到硬盘上就是那么多字节。那么前一个输出的问题到底在哪呢?

通过查看api,发现了些端倪。该方法的描述是这样的:返回可以不受阻塞地从此文件输入流中读取的字节数

如上,由于是从网络中获取数据,由于存在着网络延迟等因素,所以也就不难理解 两次输出不一致了。

当然,如果是读取本地文件的话,这个方法返回的数据大小一般是真实的。因此,如何使用以及要不要用这个方法,得根据具体的场景

若想获取网络中流的总大小,可以借助URLConnection方法

URLConnection openConnection = new URL("http://www.apache.org").openConnection(); 
System.out.println(openConnection.getContentLength());

InputStream.available()使用大坑

问题场景

文件下载功能,需要对原来的文件进行读取再输出到文件或浏览器中,会常用到InputStream.available()方法。

经历过一次系统功能变更升级,需要将文件先下载到本地再响应出去,发现下载的文件不全

百思不得其解,搜索好久资料,查找得知,以备忘记

这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。

  • 需要注意的是,如果这个方法用在从本地文件读取数据时,一般不会遇到问题,
  • 但如果是用于网络操作,就经常会遇到一些麻烦。比如,Socket通讯时,
  • 对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,
  • 或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。
  • 其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。
  • 本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,
  • 但是数据还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,
  • 这你就要调用3次available()方法才能将数据总数全部得到。

所以在进行网络数据传输时候,不能使用InputStream.available(),这个方法导致系统出现长时间暂停状态

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA如何实现右键翻译

    IDEA如何实现右键翻译

    这篇文章主要介绍了IDEA如何实现右键翻译问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot整合阿里云OSS对象存储服务实现文件上传

    SpringBoot整合阿里云OSS对象存储服务实现文件上传

    这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储实现文件上传,帮助大家更好的理解和学习使用SpringBoot,感兴趣的朋友可以了解下
    2021-04-04
  • 解决JD-GUI for mac big sur打不开问题

    解决JD-GUI for mac big sur打不开问题

    这篇文章主要介绍了解决JD-GUI for mac big sur打不开问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 关于JAVA 数组的使用介绍

    关于JAVA 数组的使用介绍

    本篇文章小编将为大家介绍,关于JAVA 数组的使用介绍,有需要的朋友可以参考一下
    2013-04-04
  • SpringBoot2.4.2下使用Redis配置Lettuce的示例

    SpringBoot2.4.2下使用Redis配置Lettuce的示例

    这篇文章主要介绍了SpringBoot2.4.2下使用Redis配置Lettuce,Springboot2.4.2下默认使用的就是Lettuce而不是Jedis因此无需在依赖进行排除Jedis,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • Java计算两个程序运行时间的实例

    Java计算两个程序运行时间的实例

    下面小编就为大家带来一篇Java计算两个程序运行时间的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Idea安装及涉及springboot详细配置的图文教程

    Idea安装及涉及springboot详细配置的图文教程

    这篇文章主要介绍了Idea安装及涉及springboot详细配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • java字符串替换排序实例

    java字符串替换排序实例

    这篇文章主要介绍了java字符串替换排序实例,有需要的朋友可以参考一下
    2014-01-01
  • Java中的CAS锁机制(无锁、自旋锁、乐观锁、轻量级锁)详解

    Java中的CAS锁机制(无锁、自旋锁、乐观锁、轻量级锁)详解

    这篇文章主要介绍了Java中的CAS锁机制(无锁、自旋锁、乐观锁、轻量级锁)详解,CAS算法的作用是解决多线程条件下使用锁造成性能损耗问题的算法,保证了原子性,这个原子操作是由CPU来完成的,需要的朋友可以参考下
    2024-01-01
  • 解析maven的用法和几个常用的命令(推荐)

    解析maven的用法和几个常用的命令(推荐)

    maven最大的作用就是用于对项目中jar包依赖的统一管理。这篇文章主要介绍了maven的用法和几个常用的命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论