发送 HTTP 时的 OutputStream OutOfMemoryError

2024-01-06

我正在尝试将大型视频/图像文件从本地文件系统发布到 http 路径,但一段时间后遇到内存不足错误...

这是代码

public boolean publishFile(URI publishTo, String localPath) throws Exception {
    InputStream istream = null;
    OutputStream ostream = null;
    boolean isPublishSuccess = false;

    URL url = makeURL(publishTo.getHost(), this.port, publishTo.getPath());
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();


    if (conn != null) {

        try {

            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("PUT");
            istream = new FileInputStream(localPath);
            ostream = conn.getOutputStream();

            int n;
            byte[] buf = new byte[4096];
            while ((n = istream.read(buf, 0, buf.length)) > 0) {
                ostream.write(buf, 0, n); //<--- ERROR happens on this line.......???
            }

            int rc = conn.getResponseCode();

            if (rc == 201) {
                isPublishSuccess = true;
            }

        } catch (Exception ex) {
            log.error(ex);
        } finally {
            if (ostream != null) {
                ostream.close();
            }

            if (istream != null) {
                istream.close();
            }
        }
    }

    return isPublishSuccess;

}

这是我遇到的错误...

Exception in thread "Thread-8773" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2786)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
    at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:61)
    at com.test.HTTPClient.publishFile(HTTPClient.java:110)
    at com.test.HttpFileTransport.put(HttpFileTransport.java:97)

The HttpUrlConnection正在缓冲数据,以便它可以设置Content-Length标头(每HTTP规范 http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3).

如果您的目标服务器支持,另一种选择是使用“chunked http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html#setChunkedStreamingMode(int)“传输。这一次只会缓冲一小部分数据。但是,并非所有服务都支持它(例如,Amazon S3 就不支持)。

另一种选择(在我看来是更好的选择)是使用雅加达 HttpClient http://hc.apache.org/httpclient-3.x/apidocs/index.html。您可以在文件的请求中设置“实体”,连接代码将相应地设置请求标头。


Edit: nos评论说OP可以打电话HttpURLConnection.setFixedLengthStreamingMode(long length)。我不知道这种方法;它是在1.5中添加的,从那以后我就没有使用过这个类。

但是,我still建议使用 Jakarta HttpClient,原因很简单,它减少了 OP 必须维护的代码量。代码是样板代码,但仍然有可能出现错误:

  • OP 正确处理循环以在输入和输出之间进行复制。通常,当我看到这样的示例时,发布者要么没有正确检查返回的缓冲区大小,要么不断重新分配缓冲区。恭喜你,但你现在必须确保你的继任者同样重视。
  • 异常处理不太好。是的,OP记得关闭连接finally块,再次祝贺你。除非其中任何一个close()调用可能会抛出IOException,阻止对方执行。该方法作为一个整体抛出Exception,这样编译器就不会帮助捕获类似的错误。
  • 我计算了 31 行代码来设置和执行响应(不包括响应代码检查和 URL 计算,但包括 try/catch/finally)。对于 HttpClient,这将在六个 LOC 的范围内。

即使OP完美地编写了这段代码,并将其重构为类似于Jakarta Commons IO中的方法,他/她不应该那样做。此代码已由其他人编写和测试。我知道这是浪费my是时候重写它了,并且怀疑这也是浪费OP的时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发送 HTTP 时的 OutputStream OutOfMemoryError 的相关文章

随机推荐

  • 如何处理nginx反向代理https到http方案重定向

    我已经将 nginx 设置为托管 jenkins 和其他一些应用程序的 ubuntu 实例上的反向代理 我使用 nginx 根据相对路径路由到各种应用程序 从客户端到 nginx 的所有流量都通过 https 进行 在防火墙后面 nginx
  • 在lisp中如何定义这样的常量?

    在Python中可以做到这一点 EMPTY PAWN KNIGHT BISHOP ROOK QUEEN KING BPAWN range 8 你会如何在 lisp 中做等价的事情 在 Lisp 中 只使用符号会更惯用 通常作为自评估关键字符
  • C# 中的方差规则

    The 方差有效性的精确规则 http blogs msdn com b ericlippert archive 2009 12 03 exact rules for variance validity aspx有点模糊而且不具体 我将列出
  • 扩展第一个容器以输出额外的 div 属性

    我开始将 pelican 与 reStructuredText 一起使用rst页面格式 我有自定义 javascript jQuery 的东西 我想用 div 属性来控制 比如data default tpl basename 具有嵌套内容
  • 上传文件并验证文件扩展名和文件大小 MVC 5

    我使用下面的代码来上传并检查文件扩展名和文件大小 Update 2控制器 public ActionResult Create Bind Include anak ID Pubdate kind title file details lin
  • 具有静态和响应宽度的两列模板

    有时我们需要结合百分比和固定值来计算尺寸 特别是在创建一些响应式布局时 就我而言 我只发现两种方法可以在纯 CSS 中实现所需的效果 Problem 让我们快速看一下这个问题 我们需要创建一个拉伸到页面整个宽度的两列布局 其中一列具有恒定的
  • Javascript:保留窗口对象引用?

    我的 javascript 代码打开一些窗口槽 var win window open 我将 win 引用与所有其他打开的窗口一起存储在一个数组中 一切正常 直到开启器刷新为止 所以我想要实现的是在加载 主 窗口时取回对打开的窗口的所有引用
  • 如何将 future 移至 lambda 表达式

    我正在使用 Visual Studio 2013 我想实现这行代码 f p get future auto task f std move f use f 我知道解决方案here https stackoverflow com questi
  • 使用枚举序数是个好习惯吗?

    我有一个枚举 public enum Persons CHILD PARENT GRANDPARENT 使用有什么问题吗ordinal 检查枚举成员之间的 层次结构 的方法 我的意思是 使用它时除了冗长之外是否有任何缺点 当有人将来可能会意
  • React Native:同步运行函数

    我是面向对象编程的新手 我对承诺 异步 同步运行函数的了解只是基础 我非常感谢您的时间和关注 这是 React Native 文档中的示例 async function getMoviesFromApi try let response a
  • 除以零不会导致 Nvidia Jetson 上的运行时异常

    我不太熟悉 ARM 处理器的内部细节 但我不明白我的 Nvidia Jetson Nano 开发板上的以下行为 C 代码示例 main c include
  • 为什么我的图像背景在 float: left 上消失?

    我想创建一个两端都有图像的导航栏 以使其更加纯净 因此 我创建了下面的 HTML 和 CSS 效果非常好 我的菜单项位于 ul li 列表中 当我设置列表样式以将所有项目放在一行上时 末端的图像消失了 那是怎么回事 我如何解决它 罪魁祸首是
  • iPad UITextField - 使用 contentVerticalAlignment = UIControlContentVerticalAlignmentCenter 调整框架大小时光标未居中

    我正在开发一款通用的 iPhone iPad 应用程序 我根据用户输入调整一些 UITextField 的大小 我还有一些代码来移动 UITextFields 以便它们的位置在调整大小时有意义 这段代码不太短 但基本上可以归结为修改 UIT
  • 快速(以开发人员时间)方式使用 Java 中的大量 C++ 代码

    背景 我们正在设计一个物理应用程序 它将进行大量数据分析 但我们的重点是集成物理电子设备 基本上我希望能够打电话root http en wikipedia org wiki ROOT 这是一个来自CERN的大数据分析库 用C 编写 用Ja
  • BigQuery - UNNEST 中引用的值必须是数组。 UNNEST 包含 STRUCT 类型的表达式 ... [5:18]

    大家好 这次我遇到了一个新的分组数组错误 我将与您分享我正在咨询的表的架构 以便您可以告诉我解决方案 我尝试使用 ARRAY TO STRING 但在这种情况下它没有成功 SELECT individual details gender A
  • 由于反射而访问私有字段和属性不是安全问题吗?

    我最近才发现here https stackoverflow com questions 95910 find a private field with reflection由于反射 可以 至少在 C 中 查找私有字段和属性 我很惊讶 尽管
  • 无法子类化 WKWebView

    我正在尝试子类化 WKWebView 当我实现自己的初始化程序时 出现以下错误 required initializer init coder must be provided by subclass of WKWebView 好的 众所周
  • C++ 程序中非常奇怪的堆栈溢出

    我前段时间写了一个程序 Mac OS X C SDL FMOD 它的性能相当不错 但最近我想扩展它的功能并添加一些更多的代码 现在 当我运行它并尝试测试新功能时 程序因 SIGABRT 崩溃 查看调试器 在函数堆栈上我看到 kill 杀死
  • 签入范围前提条件

    我喜欢番石榴前提条件 但我真正需要的是另一种方法 检查数字是否在范围内 像这样的smt probably there should be checkStateInRange also public static void checkArgu
  • 发送 HTTP 时的 OutputStream OutOfMemoryError

    我正在尝试将大型视频 图像文件从本地文件系统发布到 http 路径 但一段时间后遇到内存不足错误 这是代码 public boolean publishFile URI publishTo String localPath throws E