无法写入超出特定大小的DataOutputStream - OutOfMemoryError

Ram*_*Ram 5 java out-of-memory dataoutputstream

我有以下代码生成OutOfMemory异常:

byte[] buf = new byte[10240];
int len = 0;
DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
while ((len = _inputStream.read(buf)) > 0) {
    System.out.println("len : " + len);
    System.out.println("Going to write buf into dataOS : " + buf.length);
    dataOS.write(buf, 0, len);
    System.out.println("dataOS.size() : " + dataOS.size());
}
_inputStream.close();
Run Code Online (Sandbox Code Playgroud)

以下是调试输出的最后几行:

len : 10240
Going to write buf into dataOS : 10240
dataOS.size() : 342804702
len : 10240
Going to write buf into dataOS : 10240
dataOS.size() : 342814942
len : 10240
Going to write buf into dataOS : 10240
Run Code Online (Sandbox Code Playgroud)

当我尝试写入342814942以外的dataOS时发生异常.

有人可以帮我处理这件事吗?

谢谢!

jta*_*orn 14

它与DataOutputStream(它不保留任何数据)以及与底层流有关的一切都无关conn.getOutputStream().现在,你没有在那里显示相关代码,但我猜测"conn"是HttpURLConnection的一个实例.我相信HttpURLConnection的输出流缓冲输出,以便它可以确定输出长度(除非你明确设置它).如果你知道输出长度,你可以直接使用它来设置HttpURLConnection.setFixedLengthStreamingMode,或者你可以调用HttpURLConnection.setChunkedStreamMode允许数据以块的形式发送而不是完全缓存在内存中.

在将来,遇到OOME时,应始终生成堆转储并在内存分析器中打开它.几乎总会立即向您显示问题所在(例如在底层流中,而不是 DataOutputStream).

  • @Ram - 首先,您不需要DataOutputStream(只需直接使用conn输出流).如果您使用分块流媒体,_you_不需要做任何不同的事情.另一端的服务器需要支持分块编码(但大多数都支持). (2认同)