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

解決InputStream.available()獲取流大小問題

 更新時間:2023年06月20日 16:46:38   作者:碼農的進階之路  
這篇文章主要介紹了解決InputStream.available()獲取流大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

InputStream.available()獲取流大小問題

近日在學習IOUtils時,模擬從網絡上讀取數(shù)據(jù)存放到本地磁盤,想使用InputStream.available()查看流的大小,結果發(fā)現(xiàn)得到的大小跟實際生成文件的大小不一致。

上代碼:

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

很顯然,按照我們之前的理解,這兩個輸出得到的數(shù)據(jù)應該是一樣的。后一個輸出的文件大小是沒有問題的,寫入到硬盤上就是那么多字節(jié)。那么前一個輸出的問題到底在哪呢?

通過查看api,發(fā)現(xiàn)了些端倪。該方法的描述是這樣的:返回可以不受阻塞地從此文件輸入流中讀取的字節(jié)數(shù)

如上,由于是從網絡中獲取數(shù)據(jù),由于存在著網絡延遲等因素,所以也就不難理解 兩次輸出不一致了。

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

若想獲取網絡中流的總大小,可以借助URLConnection方法

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

InputStream.available()使用大坑

問題場景

文件下載功能,需要對原來的文件進行讀取再輸出到文件或瀏覽器中,會常用到InputStream.available()方法。

經歷過一次系統(tǒng)功能變更升級,需要將文件先下載到本地再響應出去,發(fā)現(xiàn)下載的文件不全

百思不得其解,搜索好久資料,查找得知,以備忘記

這個方法可以在讀寫操作前先得知數(shù)據(jù)流里有多少個字節(jié)可以讀取。

  • 需要注意的是,如果這個方法用在從本地文件讀取數(shù)據(jù)時,一般不會遇到問題,
  • 但如果是用于網絡操作,就經常會遇到一些麻煩。比如,Socket通訊時,
  • 對方明明發(fā)來了1000個字節(jié),但是自己的程序調用available()方法卻只得到900,
  • 或者100,甚至是0,感覺有點莫名其妙,怎么也找不到原因。
  • 其實,這是因為網絡通訊往往是間斷性的,一串字節(jié)往往分幾批進行發(fā)送。
  • 本地程序調用available()方法有時得到0,這可能是對方還沒有響應,也可能是對方已經響應了,
  • 但是數(shù)據(jù)還沒有送達本地。對方發(fā)送了1000個字節(jié)給你,也許分成3批到達,
  • 這你就要調用3次available()方法才能將數(shù)據(jù)總數(shù)全部得到。

所以在進行網絡數(shù)據(jù)傳輸時候,不能使用InputStream.available(),這個方法導致系統(tǒng)出現(xiàn)長時間暫停狀態(tài)

總結

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

相關文章

  • IDEA如何實現(xiàn)右鍵翻譯

    IDEA如何實現(xiàn)右鍵翻譯

    這篇文章主要介紹了IDEA如何實現(xiàn)右鍵翻譯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot整合阿里云OSS對象存儲服務實現(xiàn)文件上傳

    SpringBoot整合阿里云OSS對象存儲服務實現(xiàn)文件上傳

    這篇文章主要介紹了SpringBoot整合阿里云OSS對象存儲實現(xiàn)文件上傳,幫助大家更好的理解和學習使用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 數(shù)組的使用介紹

    關于JAVA 數(shù)組的使用介紹

    本篇文章小編將為大家介紹,關于JAVA 數(shù)組的使用介紹,有需要的朋友可以參考一下
    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計算兩個程序運行時間的實例

    下面小編就為大家?guī)硪黄狫ava計算兩個程序運行時間的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    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包依賴的統(tǒng)一管理。這篇文章主要介紹了maven的用法和幾個常用的命令,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論