20

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。

4

0 回答 0