亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用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中讀取到數(shù)據(jù),如果大于0的話就判斷已經(jīng)讀取到minio中的數(shù)據(jù)。

那么這樣做對不對呢?

知道解決問題后我才知道不能這樣去判斷,當然也不是絕對的,如果你是循環(huán)一行一行的去讀,也可以使用這個方法,首先來說一下available()這個方法的作用:

該方法的描述是這樣的:

返回下一次對此輸入流調(diào)用的方法可以不受阻塞地從此輸入流讀取的字節(jié)數(shù).返回一個整數(shù)值,來獲取還有多少字節(jié)可以讀取。

如上,由于是從網(wǎng)絡中獲取數(shù)據(jù),由于存在著網(wǎng)絡延遲等因素,所以可能獲取的長度是錯誤的。也就是每次得到的數(shù)字可能不一樣

當然,如果是讀取本地文件的話,這個方法返回的數(shù)據(jù)大小一般是真實的。因此,如何使用以及要不要用這個方法,得根據(jù)具體的場景

為什么有的時候已經(jīng)讀取到數(shù)據(jù),返回值還是0呢?

這個方法在進行網(wǎng)絡操作時往往出錯,因為你調(diào)用available()方法時,對發(fā)發(fā)送的數(shù)據(jù)可能還沒有到達,你得到的count是0。

也有可能一次就讀取完了,根本沒有下一次,那下一次獲取的數(shù)據(jù)肯定也是0。

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

available()方法

如果要從網(wǎng)絡中下載文件時,我們知道網(wǎng)絡是不穩(wěn)定的,也就是說網(wǎng)絡下載時,read()方法是阻塞的,說明這時我們用inputStream.available()獲取不到文件的總大小。

此時就需要通過

HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();
httpconn.getContentLength();//獲取文件長度

來獲取文件的大小。

對于一般的接口調(diào)用,可以使用inputStream.available()方法獲取返回值的數(shù)據(jù)的長度大小  如下:

?? ?//建立http連接
?? ?http.connect();
?? ?//獲取輸入流
?? ?InputStream is = http.getInputStream();?
?? ?//獲取信息的長度
?? ?int size = is.available();?
?? ?//創(chuàng)建字節(jié)數(shù)組用來存儲流數(shù)據(jù)
?? ?byte[] b = new byte[size];
?? ?//將流數(shù)據(jù)讀入字節(jié)數(shù)組中
?? ?is.read(b);

但是在 FileInputStream中已經(jīng)重寫了這個方法,重寫之后的方法是通過文件的描述來獲取文件的大小的。

那么,我們來看看哪些地方可以用available()方法來獲取文件大小,進而用來定義緩沖數(shù)組的長度。

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

2.網(wǎng)絡中的文件

  • a.比如web 中http 里面的文件流里面,第一種情況有content-length,那么小文件的情況,我們是直接可以通過request 獲取該屬性,也就知道文件的大小了。
  • b.在某些情況下,比如文件比較大,采用采用分段方式,長連接的方式發(fā)送,不能一次知道文件大小,http 的header 里面就沒有上面的content-length 屬性,而是變成了Transfer-Encoding: chunked屬性,這表示分段發(fā)送信息,但是對整個文件的接受,可以通過一些標志位,或者一些超時限制等方法處理,這里不具體研究了。   
  • c.socket 傳輸文件,是沒重寫available方法的,也就是說我們不能通過這個知道流的字節(jié)數(shù),一般情況下,我們可以先發(fā)送一段自定義的header 過去,描述文件大小,然后再循環(huán)持續(xù)獲取流信息。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring IOC推導與DI構(gòu)造器注入超詳細講解

    Spring IOC推導與DI構(gòu)造器注入超詳細講解

    這篇文章主要介紹了Spring IOC推導與DI構(gòu)造器注入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-02-02
  • 史上最全的java隨機數(shù)生成算法分享

    史上最全的java隨機數(shù)生成算法分享

    這篇文章主要介紹了史上最全的java隨機數(shù)生成算法,我分享一個最全的隨機數(shù)的生成算法,最代碼的找回密碼的隨機數(shù)就是用的這個方法
    2014-01-01
  • mybatis plus in方法使用說明

    mybatis plus in方法使用說明

    這篇文章主要介紹了mybatis plus in方法使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 詳解Spring mvc的web.xml配置說明

    詳解Spring mvc的web.xml配置說明

    本篇文章主要介紹了Spring mvc的web.xml配置說明,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java線程池execute()方法源碼全面解析

    Java線程池execute()方法源碼全面解析

    這篇文章主要介紹了Java線程池execute()方法源碼全面解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解SpringBoot簡化配置分析總結(jié)

    詳解SpringBoot簡化配置分析總結(jié)

    這篇文章主要介紹了詳解SpringBoot簡化配置分析總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java線程狀態(tài)變換過程代碼解析

    Java線程狀態(tài)變換過程代碼解析

    這篇文章主要介紹了Java線程狀態(tài)變換過程代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • java實現(xiàn)租車系統(tǒng)

    java實現(xiàn)租車系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)租車系統(tǒng),以及遇到的兩個問題解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Spring?AOP手寫動態(tài)代理代碼實例

    Spring?AOP手寫動態(tài)代理代碼實例

    這篇文章主要介紹了Spring?AOP手寫動態(tài)代理代碼實例,AOP我們知道,是在不修改源代碼的情況下,為代碼添加一些新功能的技術(shù),通過動態(tài)代理,可以在不修改原始類代碼的前提下,對方法進行攔截和增強,需要的朋友可以參考下
    2024-01-01
  • 詳解SpringMVC 自動封裝枚舉類的方法

    詳解SpringMVC 自動封裝枚舉類的方法

    springmvc默認無法自動封裝枚舉類,本篇文章主要介紹了詳解SpringMVC 自動封裝枚舉類的方法,有興趣的可以了解一下。
    2017-04-04

最新評論