字节大于2gb的ByteArrayOutputStream:java.lang.OutOfMemoryError

时间:2018-04-04 00:49:11

标签: java httpurlconnection bytearrayoutputstream

当我尝试上传大于2GB的文件时,java.io.ByteArrayOutputStream正在提供OutOfMemoryError。

我检查了这个类,发现以下代码导致了这个问题。

 private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

MAX_ARRAY_SIZE定义为:private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

有没有办法克服这个问题,并使用这个类上传任何大小的文件?或者是否有其他方式上传文件。

2 个答案:

答案 0 :(得分:0)

  

有没有办法克服这个问题并使用这个类上传任何大小的文件?

没有。没有。

您正在将文件上传到内存中,并且无法将无限大文件加载到内存中。记忆是有限的。

(是的,你可以得到一个更大的内存更大的服务器,但这只会使上传限制更大......并引入次要问题。)

  

或者是否有其他方式上传文件。

将其流式传输到本地文件;即使用FileOutputStream代替ByteArrayOutputStream。现在这又带来了另外两个问题:

  1. 如何避免使用大量上传来填充文件系统。
  2. 如何在处理完文件后清理上传的文件...以避免使用大量小型上传文件系统填写文件系统。
  3. 没有简单的答案。但是,当您允许人员将文件上传到您的服务器时,这些问题就会出现。

答案 1 :(得分:0)

如果这是来自您的标记建议的HttpURLConnection上传,即您正在写入其输出流,则应使用分块或固定长度传输模式。否则HttpURLConnection必须在内存中缓冲整个上传,以便在发送任何内容之前知道Content-length。如果你让它块,或通过使用固定长度告诉它内容长度,它直接写入线。