使用InputStream的available()能否用來(lái)判斷當(dāng)前流是否讀取到文件
InputStream available()能否用來(lái)判斷當(dāng)前流是否讀取到文件
讀取minio中的文件的時(shí)候,通過(guò)以下代碼。
InputStream inputStream = minioClient.getObject(minio_bucketNameExam,fileurl);
而我想做的事情是在讀取完了以后判斷一下
inputStream.available()
是否等于0,如果等于0的話,就判斷沒(méi)有從minio中讀取到數(shù)據(jù),如果大于0的話就判斷已經(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)然,如果是讀取本地文件的話,這個(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)文章
Spring IOC推導(dǎo)與DI構(gòu)造器注入超詳細(xì)講解
這篇文章主要介紹了Spring IOC推導(dǎo)與DI構(gòu)造器注入,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02詳解Spring mvc的web.xml配置說(shuō)明
本篇文章主要介紹了Spring mvc的web.xml配置說(shuō)明,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02詳解SpringBoot簡(jiǎn)化配置分析總結(jié)
這篇文章主要介紹了詳解SpringBoot簡(jiǎn)化配置分析總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10java實(shí)現(xiàn)租車(chē)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)租車(chē)系統(tǒng),以及遇到的兩個(gè)問(wèn)題解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Spring?AOP手寫(xiě)動(dòng)態(tài)代理代碼實(shí)例
這篇文章主要介紹了Spring?AOP手寫(xiě)動(dòng)態(tài)代理代碼實(shí)例,AOP我們知道,是在不修改源代碼的情況下,為代碼添加一些新功能的技術(shù),通過(guò)動(dòng)態(tài)代理,可以在不修改原始類代碼的前提下,對(duì)方法進(jìn)行攔截和增強(qiáng),需要的朋友可以參考下2024-01-01