五月激情久久_黄色国产_狠狠爱网址_av黄色在线观看_日韩a视频_一级少妇女片

欢迎您访问如何判断 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的基本释义为等等。贝语网校(www.nenqi.cn)为您提供brawn发音,英语单词brawn的音标,brawn中文意思,brawn的过去式,brawn双语例句等相关英语知识。

2024-09-20 15:54

brawl是什么意思_brawl怎么读_brawl翻译_用法_发音_词组_同反义词

brawl的基本释义为等等。贝语网校(www.nenqi.cn)为您提供brawl发音,英语单词brawl的音标,brawl中文意思,brawl的过去式,brawl双语例句等相关英语知识。

2024-09-20 15:54

bravo是什么意思_bravo怎么读_bravo翻译_用法_发音_词组_同反义词

bravo的基本释义为等等。贝语网校(www.nenqi.cn)为您提供bravo发音,英语单词bravo的音标,bravo中文意思,bravo的过去式,bravo双语例句等相关英语知识。

2024-09-20 15:53

bravery是什么意思_bravery怎么读_bravery翻译_用法_发音_词组_同反义词

bravery的基本释义为 基本解释 n. 勇敢,勇气;辉煌,华丽;刚毅等等。贝语网校(www.nenqi.cn)为您提供bravery发音,英语单词bravery的音标,bravery中文意思,bravery的过去式,bravery双语例句等相关英语知识。

2024-09-20 15:53

braver是什么意思_braver怎么读_braver翻译_用法_发音_词组_同反义词

braver的基本释义为 基本解释 adj. 勇敢的;勇敢的( brave的比较级 );需要勇气的;表现勇敢的;新颖的等等。贝语网校(www.nenqi.cn)为您提供braver发音,英语单词braver的音标,braver中文意思,braver的过去式,braver双语例句等相关英语知识。

2024-09-20 15:52

加载中...
主站蜘蛛池模板: 99只有精品| 亚洲成人999 | 亚洲综合四区 | 91| 午夜 国产| 免费精品视频一区二区三区 | 国产欧亚州美日韩综合区 | 91www视频| 国产区中文字幕 | 亚洲视频免费在线看 | 在线免费看毛片 | 亚洲精品少妇一区二区 | 国产成人91 | 91亚洲国产成人精品一区二三 | 91精品在线观看入口 | 91视频免费入口 | 全部免费毛片在线播放 | 九九热免费在线视频 | 91视频最新网址 | 久久成人在线观看 | 91文字幕巨乱亚洲香蕉 | 91官网视频| 99热在线观看精品 | av片大全 | 伦理电影91 | 国产精品一区二区三区免费在线观看 | 午夜性色a√在线视频观看9 | 国产一区二区三区成人久久片老牛 | 99久久婷婷国产综合精品免费 | 国产成人精品a视频一区www | a在线一区 | 国产成人久久久精品免费澳门 | 一区二区在线观看免费 | 国产福利视频在线 | 夜色321看片资源站 亚洲撸 | 国产欧美一二三区 | 欧美日韩精品一区二区三区 | 91视频高清| 91热热热 | 嫩草你懂的 | 小早川怜子一区二区的演员表 |