尽管设置了分块流模式,HttpURLConnection缓冲而不是流式传输?

时间:2011-04-20 16:42:49

标签: java streaming out-of-memory httpurlconnection http-chunked

我正在使用HttpURLConnection向服务器写入文件,其中一些文件非常大。

final HttpURLConnection conn = (HttpURLConnection) url.openConnection();

前段时间我写了1 GB或更多的对象时遇到了问题。我通过将其设置为流更易管理的块大小来修复它。

final int bufferSize = 1024 * 1024;
[...]
conn.setChunkedStreamingMode(bufferSize);

然后我的笔记本电脑上运行正常,但在其他机器上却崩溃了。经过调查,我发现原因是在写入输出流时发生了内存不足错误。

final OutputStream out = conn.getOutputStream();
final long bytesWritten = IOUtils.copyLarge(in, out);

在copyLarge例程中,我发现它能够进行262145次4096字节的迭代,在尝试越过1 GB行时失败。为java应用程序分配更多内存似乎可以防止这些崩溃,但我认为这应该是不必要的。如果它正在写1 MB的块,那么它应该失败,迭代次数少得多,或者反复写入1 MB而没有问题。

更新:结果显示在某些机器上实际上没有调用ChunkedStreamingMode的行设置。如果你没有设置固定/分块流模式,HttpURLConnection只会将所有内容发送到PosterOutputStream / ByteArrayOutputStream。

0 个答案:

没有答案