porn一区_国产精品久久久久永久免费观看_久久com_亚洲美女视频一区二区三区_日日天天_在线精品亚洲欧美日韩国产

歡迎您訪問如何判斷 InputStream 是否為空及常見解決方案!

如何判斷 InputStream 是否為空及常見解決方案

更新時間:2024-09-21 08:30:07作者:佚名

在某些業務場景中,需要判斷獲取到的InputStream是否為空。

InputStream沒有接口去判斷是否為空或者獲取其大小,本文會列出項目中見到的一些解決方案。

輸入流可用

有些同學直接把InputStream.available當成流的實際大小,比如下載的時候就直接把InputStream.available設置為Content-Length,這個是很大的錯誤,available方法注釋里明確寫到:

返回可從此輸入流讀取(或跳過)的字節數估計值estimate是什么意思?怎么讀,而不會被下次調用此輸入流的方法阻塞。

估計是一個大概的估計,并不代表流的實際大小,如果是FileInputStream的話,我的測試結果和文件大小是一致的,但是有可能不同的操作系統,不同品牌的JDK版本可能會產生不同的結果。

如果你的業務可以接受這個估算值,那么就可以用它來判斷流是否為空。

toByteArray 轉換字節數組

IOUtils.toByteArray(InputStream) 轉為字節數組,由于通過流無法獲取大小,所以我就繞了個彎子,把流轉為字節數組,這樣之后不就為所欲為了了嗎?

這樣確實能拿到值,而且能準確判斷是否為空。但是如果一次性把流讀成字節數組,你不覺得內存可能受不了?

InputStream其實就是連接自來水廠的水管,不管是一噸水還是十噸水,這個InputStream占用的內存基本是固定的。用專業的話來說,它的空間復雜度是O(1)。如果把它轉化成字節數組,就相當于把你家里的十噸水全部存起來了。數據量少的話還好,但是如果遇到大數據量或者高并發的話,內存就會立馬爆掉。

聽我的建議,除非你能清楚地評估沒有 OOM 風險,否則不要轉換為字節數組。

讀取第一個字節

既然只需要判斷是否為空,那我何必這么麻煩呢?InputStream不是有read方法嗎?難道不能先讀取第一個字節,然后判斷是否為空嗎?

前面我們說過,InputStream 就像是一根水管,每讀到一個字節,流中就會少一個字節。它就像一個送貨員網校頭條,你問他湯咸不咸estimate是什么意思?怎么讀,他喝了一口說:湯不錯,不咸。如果你喝到一半湯,你會是什么感覺?雖然 InputStream 提供了 reset 方法,但是默認會拋出異常。并不是所有的流都可以 reset,就像愛情有多少次可以重來一樣。

????public?synchronized?void?reset()?throws?IOException?{
????????throw?new?IOException("mark/reset?not?supported");
????}

PushbackInputStream 的終極解決方案

PushbackInputStream,顧名思義就是可以回滾的流,你可以用它來包裝原來的流,這樣就可以檢查流是否為空。

????/**
?????*?檢查輸入流是否為空,并返回包裝后的流
?????*?請注意,原始流已經被讀了一個字節,后續不能直接對原始流進行讀取
?????*
?????*?@param?inputStream?inputStream
?????*?@return?包裝之后的流,后續操作的都是這個流
?????*/

????public?InputStream?checkStreamIsNotEmpty(InputStream?inputStream)?throws?IOException,
????????????EmptyInputStreamException?{
????????AssertKit.isNull(inputStream,?"流不能為null");
????????PushbackInputStream?pushbackInputStream?=?new?PushbackInputStream(inputStream);
????????int?b?=?pushbackInputStream.read();
????????if?(b?==?-1)?{
????????????throw?new?EmptyInputStreamException("這個流是空的,啥也沒有。?"?+?inputStream);
????????}
????????pushbackInputStream.unread(b);
????????return?pushbackInputStream;
????}

為您推薦

2016 年第 4 篇第 5 句考研閱讀逐句翻譯:實體報紙的基礎設施及其限制

考研閱讀逐句翻譯翻譯思路:考研閱讀逐句翻譯翻譯思路:這兩句話里,有兩個詞很生動。print,讀者流失了,他們不讀紙版報紙了,可能去讀網絡版或者手機版報紙。它用作動詞,就是“使...變矮”,這個詞,有時候用中文“相形見絀”,的確是不錯的翻譯。考研閱讀逐句翻譯2016年第4篇第8句考研閱讀逐句翻譯2016年第4篇第9句

2024-09-21 17:30

brawn是什么意思_brawn怎么讀_brawn翻譯_用法_發音_詞組_同反義詞

brawn的基本釋義為等等。貝語網校(m.hefrebsx.cn)為您提供brawn發音,英語單詞brawn的音標,brawn中文意思,brawn的過去式,brawn雙語例句等相關英語知識。

2024-09-20 15:54

brawl是什么意思_brawl怎么讀_brawl翻譯_用法_發音_詞組_同反義詞

brawl的基本釋義為等等。貝語網校(m.hefrebsx.cn)為您提供brawl發音,英語單詞brawl的音標,brawl中文意思,brawl的過去式,brawl雙語例句等相關英語知識。

2024-09-20 15:54

bravo是什么意思_bravo怎么讀_bravo翻譯_用法_發音_詞組_同反義詞

bravo的基本釋義為等等。貝語網校(m.hefrebsx.cn)為您提供bravo發音,英語單詞bravo的音標,bravo中文意思,bravo的過去式,bravo雙語例句等相關英語知識。

2024-09-20 15:53

bravery是什么意思_bravery怎么讀_bravery翻譯_用法_發音_詞組_同反義詞

bravery的基本釋義為 基本解釋 n. 勇敢,勇氣;輝煌,華麗;剛毅等等。貝語網校(m.hefrebsx.cn)為您提供bravery發音,英語單詞bravery的音標,bravery中文意思,bravery的過去式,bravery雙語例句等相關英語知識。

2024-09-20 15:53

braver是什么意思_braver怎么讀_braver翻譯_用法_發音_詞組_同反義詞

braver的基本釋義為 基本解釋 adj. 勇敢的;勇敢的( brave的比較級 );需要勇氣的;表現勇敢的;新穎的等等。貝語網校(m.hefrebsx.cn)為您提供braver發音,英語單詞braver的音標,braver中文意思,braver的過去式,braver雙語例句等相關英語知識。

2024-09-20 15:52

加載中...
主站蜘蛛池模板: 欧洲在线一区 | 国产 日韩 欧美 在线 | 中文字幕亚洲一区二区三区 | 人人超碰在线 | 成人爽a毛片免费啪啪动漫 日本特级片 | 午夜视频在线观看网站 | 性培育学校羞耻椅子调教h 另类中文字幕 | 中文字幕日韩一区二区不卡 | 91精品国产高清一区二区性色 | 日韩欧美中文字幕在线视频 | 日本特级片| 成人视屏在线观看 | 羞羞在线视频 | 中文字幕精品一区 | 精品9999 | 国产精品理论视频 | 日韩电影三级 | 欧美亚洲一区 | 黄色成人av | 久久精品国产99国产 | 日本草草影院 | 精品国产一区二区三区久久久蜜臀 | 午夜视频在线观看网站 | 中文字幕视频免费观看 | 女人毛片a毛片久久人人 | 欧美一级毛片免费看 | 国产又粗又长又硬又猛电影 | 国产毛片久久久 | 亚洲伊人久久综合 | 欧洲猛妇oooo| 日本精品视频在线观看 | 福利精品 | 欧美一级高潮片免费的 | 黄色av免费在线观看 | 免费欧美视频 | 国产乱人伦av在线a 日韩电影中文字幕 | 亚洲一区二区三区四区五区午夜 | 日韩国产精品一区二区三区 | 日韩欧美高清 | 色婷婷一区 | 图片区 国产 欧美 另类 在线 |