【问题标题】:BufferedInputStream read vs IOUtils toByteArrayBufferedInputStream 读取与 IOUtils toByteArray
【发布时间】: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


【解决方案1】:

@Gaurav_Joshi

接受一个参数 InputStream 的 BufferedInputStream 构造函数使用 DEFAULT_BUFFER_SIZE,它可能小于输入流的实际大小。

public BufferedInputStream(InputStream in) {
    this(in, DEFAULT_BUFFER_SIZE);
}

【讨论】:

  • 这正是我的问题!我的数据长度很大,可能大于 DEFAULT_BUFFER_SIZE !惊人的 !谢谢!
  • 我相信这个答案没有回答问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2014-02-01
  • 2013-08-19
  • 2012-06-18
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多