【发布时间】:2017-05-05 03:50:52
【问题描述】:
我最近尝试从 inputStream 读取数据。
int length = getHeader("Content-Length");
byte[] buffer = new byte [length];
BufferedInputStream stream = new BufferedInputStream (servletRequest.getInputStream());
stream.read(buffer);
它以某种方式截断了我的数据。当我尝试关注
buffer = IOUtils.toByteArray(servletRequest.getInputStream());
效果很好。
谁能告诉我可能是什么问题?
【问题讨论】:
-
@SotiriosDelimanolis 内容长度不准确怎么办?
-
两件事。首先,您的
getHeader是做什么的?它是否返回正确的值?其次,read(byte[])返回一个int值,显示实际读入缓冲区的字节数。如果这不是您所期望的,您需要循环调用该方法(或其带有偏移量的重载),直到您阅读完所有内容。这或多或少是toByteArray所做的。 -
@TimBiegeleisen 是的,可能是问题所在。
-
您可以将流包装在 DataInputStream 中,然后使用 readFully() 执行所有循环,直到整个字节数组被数据填充。但正如 tim 指出的那样,使用 HTTP 的内容长度可能是错误的,或者更常见的是缺失(这不是强制性的)。在这种情况下,IOUtils 方法更安全
-
@SotiriosDelimanolis 认为它是伪代码。它正在从请求中获取所需的标头。此外,内容长度准确,与发送的内容完全匹配。
标签: java servlets inputstream