Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java获取大型inputstream的大小会导致内存不足_Java_Amazon S3_Inputstream_Guava_Apache Commons Io - Fatal编程技术网

Java获取大型inputstream的大小会导致内存不足

Java获取大型inputstream的大小会导致内存不足,java,amazon-s3,inputstream,guava,apache-commons-io,Java,Amazon S3,Inputstream,Guava,Apache Commons Io,我使用的是这段标准代码,但内存不足。通过testream.toArray甚至IOUtils.toByteArray尝试了谷歌番石榴,但没有成功。目的是获取大型二进制文件的输入流长度,以便进一步处理输入流。此外,还存在使用文件系统的限制 byte[] data = new byte[4096]; while ((nRead = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, nRead); } 如果读取文件不是一

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

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

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


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

如果您打算在内存中保存大量数据,这通常不是一个好主意,那么您需要大量内存。要么给JVM更多内存,要么想出一个更智能的设计。我正在寻找更智能的设计:-。一个选项可能是将inputstream保存在文件系统上,但不幸的是,我不能使用这个选项。我有一个约束条件,我需要计算输入流的长度,然后对该输入流执行某些操作。如果您的唯一目标是找到总大小,那么为什么要将整个内容保留在内存中?您是否将写入的数据保留在缓冲区中以备日后使用?您必须更好地解释您试图实现的目标。如果您不能像通常情况下那样读取两次流,那么您将不得不找到某种存储字节的方法。获取更多内存,这很便宜。content-disposition头也是一个选项,如另一篇堆栈溢出文章中所述