【发布时间】: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