检查 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。我尝试使用 800KB1.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 是不是为空?

确定 InputStream 的大小

Java如何从InputStream中读取收入大小? [复制]

将 InputStream 写入文件 [重复]

从 InputStream 调整位图大小

忽略词缀检查器的大小写[重复]