【问题标题】:Java getting size of large inputstream gives out of memoryJava获取大输入流的大小导致内存不足
【发布时间】:2018-01-15 04:25:13
【问题描述】:

我正在使用这段标准代码,但内存不足。尝试了谷歌番石榴 Bytestream.toArray 甚至 IOUtils.toByteArray 但没有运气。目的是获取大型二进制文件的输入流的长度,以便进一步处理输入流。还有使用文件系统的限制。

byte[] data = new byte[4096];
while ((nRead = is.read(data, 0, data.length)) != -1) {
    buffer.write(data, 0, nRead);
}

【问题讨论】:

  • 如果您打算在内存中保留大量数据(这通常不是一个好主意),那么您需要大量内存。要么给 JVM 更多内存,要么提出更智能的设计。
  • 我正在寻找更智能的设计 :-)。一种选择可能是将输入流保存在文件系统上,但不幸的是我不能使用这个选项。我有一个约束,我需要计算输入流的长度,然后对该输入流执行某些操作。
  • 如果您的唯一目标是找到总大小,那么为什么要将整个内容保存在内存中?您是否将写入的数据保存在缓冲区中以备后用?
  • 你必须更好地解释你想要达到的目标。
  • 如果您不能两次读取流(通常是这种情况),那么您将不得不找到某种存储字节的方法。获取更多内存,价格便宜。

标签: java amazon-s3 inputstream guava apache-commons-io


【解决方案1】:

如果读取文件不是一个选项并且它来自多部分请求,您可以尝试使用content-length 标头。

另一个选项是强制客户端为文件提供文件大小,这样您就不需要将它加载到内存中。请注意,这仅在您的 API 客户端受信任时才有意义。

【讨论】:

猜你喜欢
  • 2012-07-03
  • 1970-01-01
  • 2014-08-02
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多