最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用InputStream的available()能否用來(lái)判斷當(dāng)前流是否讀取到文件

 更新時(shí)間:2023年06月20日 16:06:11   作者:藍(lán)奕世  
這篇文章主要介紹了使用InputStream的available()能否用來(lái)判斷當(dāng)前流是否讀取到文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

InputStream available()能否用來(lái)判斷當(dāng)前流是否讀取到文件

讀取minio中的文件的時(shí)候,通過(guò)以下代碼。

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

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

inputStream.available()

是否等于0,如果等于0的話(huà),就判斷沒(méi)有從minio中讀取到數(shù)據(jù),如果大于0的話(huà)就判斷已經(jīng)讀取到minio中的數(shù)據(jù)。

那么這樣做對(duì)不對(duì)呢?

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

該方法的描述是這樣的:

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

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

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

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

這個(gè)方法在進(jìn)行網(wǎng)絡(luò)操作時(shí)往往出錯(cuò),因?yàn)槟阏{(diào)用available()方法時(shí),對(duì)發(fā)發(fā)送的數(shù)據(jù)可能還沒(méi)有到達(dá),你得到的count是0。

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

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

available()方法

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

此時(shí)就需要通過(guò)

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

來(lái)獲取文件的大小。

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

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

但是在 FileInputStream中已經(jīng)重寫(xiě)了這個(gè)方法,重寫(xiě)之后的方法是通過(guò)文件的描述來(lái)獲取文件的大小的。

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Java后端限制頻繁請(qǐng)求和重復(fù)提交的實(shí)現(xiàn)

    Java后端限制頻繁請(qǐng)求和重復(fù)提交的實(shí)現(xiàn)

    很多用戶(hù)會(huì)請(qǐng)求過(guò)于頻繁或者是多次重復(fù)提交數(shù)據(jù),本文主要介紹了Java后端限制頻繁請(qǐng)求和重復(fù)提交的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • JAVA過(guò)濾器和攔截器有什么區(qū)別詳細(xì)講解

    JAVA過(guò)濾器和攔截器有什么區(qū)別詳細(xì)講解

    在JavaWeb開(kāi)發(fā)中,過(guò)濾器(Filter)和攔截器(Interceptor)是兩種重要的組件,主要用于攔截和處理請(qǐng)求,過(guò)濾器屬于JavaServlet規(guī)范,用于請(qǐng)求到達(dá)目標(biāo)資源之前或響應(yīng)返回客戶(hù)端之前的處理,需要的朋友可以參考下
    2024-10-10
  • Java SPI 機(jī)制知識(shí)點(diǎn)總結(jié)

    Java SPI 機(jī)制知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于Java SPI 機(jī)制知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們可以參考下。
    2020-02-02
  • java隊(duì)列中Queue與Deque的區(qū)別面試精講

    java隊(duì)列中Queue與Deque的區(qū)別面試精講

    這篇文章主要為大家介紹了java隊(duì)列中Queue與Deque的區(qū)別面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 如何理解和運(yùn)用ClassLoader

    如何理解和運(yùn)用ClassLoader

    這篇文章主要介紹了如何理解和運(yùn)用 ClassLoader,幫助大家更好的理解和使用JVM,感興趣的朋友可以了解下
    2021-01-01
  • java計(jì)算時(shí)間差的方法

    java計(jì)算時(shí)間差的方法

    這篇文章主要介紹了java計(jì)算時(shí)間差的方法,涉及java針對(duì)時(shí)間的轉(zhuǎn)換與計(jì)算相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java中outer標(biāo)簽的用法實(shí)例代碼

    Java中outer標(biāo)簽的用法實(shí)例代碼

    這篇文章主要介紹了Java中outer標(biāo)簽的用法,在這里需要大家注意這里的outer并不是關(guān)鍵字,而僅僅是一個(gè)標(biāo)簽,本文結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-01-01
  • 詳解spring security 配置多個(gè)AuthenticationProvider

    詳解spring security 配置多個(gè)AuthenticationProvider

    這篇文章主要介紹了詳解spring security 配置多個(gè)AuthenticationProvider ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 使用RequestBodyAdvice實(shí)現(xiàn)對(duì)Http請(qǐng)求非法字符過(guò)濾

    使用RequestBodyAdvice實(shí)現(xiàn)對(duì)Http請(qǐng)求非法字符過(guò)濾

    這篇文章主要介紹了使用RequestBodyAdvice實(shí)現(xiàn)對(duì)Http請(qǐng)求非法字符過(guò)濾的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JVM加載class文件的原理機(jī)制實(shí)例詳解

    JVM加載class文件的原理機(jī)制實(shí)例詳解

    Java是一種具有動(dòng)態(tài)性的解釋型語(yǔ)言,類(lèi)(class)只有被加載到JVM后才能運(yùn)行,接下來(lái)通過(guò)本文給大家介紹JVM加載class文件的原理機(jī)制詳解,感興趣的朋友一起看看吧
    2022-04-04

最新評(píng)論

湘潭县| 汨罗市| 永宁县| 桃源县| 东乌| 云和县| 水城县| 金平| 阿拉善左旗| 漳州市| 祁阳县| 沙坪坝区| 康乐县| 福海县| 镇原县| 横山县| 泰顺县| 凤城市| 凌源市| 宽甸| 崇信县| 桑日县| 隆回县| 金门县| 盐山县| 黄龙县| 怀化市| 和林格尔县| 尚志市| 太湖县| 府谷县| 南宁市| 新巴尔虎左旗| 青冈县| 辽宁省| 巢湖市| 合作市| 大丰市| 高淳县| 澄迈县| 浦东新区|