使用InputStream的available()能否用来判断当前流是否读取到文件

 更新时间:2023年06月20日 16:06:11   作者:蓝奕世  
这篇文章主要介绍了使用InputStream的available()能否用来判断当前流是否读取到文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

InputStream available()能否用来判断当前流是否读取到文件

读取minio中的文件的时候,通过以下代码。

InputStream inputStream = minioClient.getObject(minio_bucketNameExam,fileurl);

而我想做的事情是在读取完了以后判断一下

inputStream.available()

是否等于0,如果等于0的话,就判断没有从minio中读取到数据,如果大于0的话就判断已经读取到minio中的数据。

那么这样做对不对呢?

知道解决问题后我才知道不能这样去判断,当然也不是绝对的,如果你是循环一行一行的去读,也可以使用这个方法,首先来说一下available()这个方法的作用:

该方法的描述是这样的:

返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数.返回一个整数值,来获取还有多少字节可以读取。

如上,由于是从网络中获取数据,由于存在着网络延迟等因素,所以可能获取的长度是错误的。也就是每次得到的数字可能不一样

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

为什么有的时候已经读取到数据,返回值还是0呢?

这个方法在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。

也有可能一次就读取完了,根本没有下一次,那下一次获取的数据肯定也是0。

FileInputStream与InputStream的available()方法的作用

available()方法

如果要从网络中下载文件时,我们知道网络是不稳定的,也就是说网络下载时,read()方法是阻塞的,说明这时我们用inputStream.available()获取不到文件的总大小。

此时就需要通过

HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();
httpconn.getContentLength();//获取文件长度

来获取文件的大小。

对于一般的接口调用,可以使用inputStream.available()方法获取返回值的数据的长度大小  如下:

    //建立http连接
    http.connect();
    //获取输入流
    InputStream is = http.getInputStream(); 
    //获取信息的长度
    int size = is.available(); 
    //创建字节数组用来存储流数据
    byte[] b = new byte[size];
    //将流数据读入字节数组中
    is.read(b);

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

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

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

2.网络中的文件

  • a.比如web 中http 里面的文件流里面,第一种情况有content-length,那么小文件的情况,我们是直接可以通过request 获取该属性,也就知道文件的大小了。
  • b.在某些情况下,比如文件比较大,采用采用分段方式,长连接的方式发送,不能一次知道文件大小,http 的header 里面就没有上面的content-length 属性,而是变成了Transfer-Encoding: chunked属性,这表示分段发送信息,但是对整个文件的接受,可以通过一些标志位,或者一些超时限制等方法处理,这里不具体研究了。   
  • c.socket 传输文件,是没重写available方法的,也就是说我们不能通过这个知道流的字节数,一般情况下,我们可以先发送一段自定义的header 过去,描述文件大小,然后再循环持续获取流信息。

总结

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

相关文章

  • Java后端限制频繁请求和重复提交的实现

    Java后端限制频繁请求和重复提交的实现

    很多用户会请求过于频繁或者是多次重复提交数据,本文主要介绍了Java后端限制频繁请求和重复提交的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • JAVA过滤器和拦截器有什么区别详细讲解

    JAVA过滤器和拦截器有什么区别详细讲解

    在JavaWeb开发中,过滤器(Filter)和拦截器(Interceptor)是两种重要的组件,主要用于拦截和处理请求,过滤器属于JavaServlet规范,用于请求到达目标资源之前或响应返回客户端之前的处理,需要的朋友可以参考下
    2024-10-10
  • Java SPI 机制知识点总结

    Java SPI 机制知识点总结

    在本篇文章里小编给大家整理的是一篇关于Java SPI 机制知识点总结内容,需要的朋友们可以参考下。
    2020-02-02
  • java队列中Queue与Deque的区别面试精讲

    java队列中Queue与Deque的区别面试精讲

    这篇文章主要为大家介绍了java队列中Queue与Deque的区别面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 如何理解和运用ClassLoader

    如何理解和运用ClassLoader

    这篇文章主要介绍了如何理解和运用 ClassLoader,帮助大家更好的理解和使用JVM,感兴趣的朋友可以了解下
    2021-01-01
  • java计算时间差的方法

    java计算时间差的方法

    这篇文章主要介绍了java计算时间差的方法,涉及java针对时间的转换与计算相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java中outer标签的用法实例代码

    Java中outer标签的用法实例代码

    这篇文章主要介绍了Java中outer标签的用法,在这里需要大家注意这里的outer并不是关键字,而仅仅是一个标签,本文结合实例代码给大家详细讲解,需要的朋友可以参考下
    2023-01-01
  • 详解spring security 配置多个AuthenticationProvider

    详解spring security 配置多个AuthenticationProvider

    这篇文章主要介绍了详解spring security 配置多个AuthenticationProvider ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 使用RequestBodyAdvice实现对Http请求非法字符过滤

    使用RequestBodyAdvice实现对Http请求非法字符过滤

    这篇文章主要介绍了使用RequestBodyAdvice实现对Http请求非法字符过滤的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • JVM加载class文件的原理机制实例详解

    JVM加载class文件的原理机制实例详解

    Java是一种具有动态性的解释型语言,类(class)只有被加载到JVM后才能运行,接下来通过本文给大家介绍JVM加载class文件的原理机制详解,感兴趣的朋友一起看看吧
    2022-04-04

最新评论