检查 InputStream 大小的问题 [重复]
Posted
技术标签:
【中文标题】检查 InputStream 大小的问题 [重复]【英文标题】:Issue with checking InputStream size [duplicate] 【发布时间】:2016-12-18 17:34:23 【问题描述】:我有一个奇怪的问题:
我的 dropwizard API 处理上传的文件并将其保存为 JPEG 图像
上传的文件被读取为InputStream
。
FormDataBodyPart fileBody
使用 @FormDataParam("file")
读取
InputStream imageStream = fileBody.getValueAs(InputStream.class);
final int maxSize = 102400;
final byte[] bytes = new byte[maxSize + 1];
int totalBytes = this.imageStream.read(bytes);
System.out.println("totalBytes:"+totalBytes);
无论上传文件的原始大小如何,返回的 totalBytes
值永远不会大于 8181
。我尝试使用 800KB
和 1.3MB
文件
HttpServletRequest.getContentLength()
显示上传的正确字节数
我在这里错过了什么?
【问题讨论】:
我只想指出幻数8181
有一些可能的解释:8181*8=65 448 ~ 65 536 = 2^16
-> 16 bits = 2 bytes
。我可能错了。
【参考方案1】:
InputStream.read(byte[])
不保证阅读完整内容。来自 javadoc:
从输入流中读取一些字节并将它们存储到缓冲区数组 b 中。实际读取的字节数以整数形式返回。在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。
第一次调用时似乎只有 8181 个字节可用。您需要继续阅读,直到该方法返回 -1 并合并所有读取的字节。
【讨论】:
发现这很有用:int totalBytes = ByteStreams.toByteArray(this.imageStream).length;
使用谷歌番石榴在这里回答:Convert InputStream to byte array in Java以上是关于检查 InputStream 大小的问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不读取 InputStream 的情况下检查 InputStream 是不是为空?