【问题标题】:2GB limitation Java Input Stream2GB 限制 Java 输入流
【发布时间】:2014-01-23 09:55:47
【问题描述】:

我能够从 http 位置读取小于 2GB 的文件。但是,如果我尝试读取大于 2 GB 的文件,则会出现异常。我没有完全阅读,而是分块阅读。下面是我的代码 sn-p 和异常消息。如果您有进一步的线索,请帮助我

BufferedOutputStream bos = new BufferedOutputStream(os);
                    URL url = new URL(fileName);
                    LOGGER.debug(url.toString());
                    URLConnection connection = url.openConnection();

                    LOGGER.debug("Before getting input stream 100 MB, open input stream::" + downloadFileName);
                    // BufferedInputStream in = new BufferedInputStream(url.openStream());
                    InputStream in = url.openStream();
                  //  InputStreamReader inReader = new InputStreamReader(in);

                    // InputStream in = connection.getInputStream();
                    LOGGER.debug("Afters getting input stream, open inputstream::" + downloadFileName);
                    // in.

                    // LOGGER.debug("in1::" + in1);

                    final byte[] buffer = new byte[100 * 1024 * 1024]; // 100Mb
                    while (true)
                    {
                        LOGGER.debug("Reading..");

                        final int read = in.read(buffer);
                        LOGGER.debug("Read..");

                        if (read < 0)
                        {
                            break;
                        }
                        LOGGER.debug("Writing..");
                        bos.write(buffer, 0, read);

                        LOGGER.debug("Wrote..");

                        // bos.

                    }

【问题讨论】:

  • 您是否能够/是否尝试过更改 JVM 的最大堆大小?
  • 能不写不写试试看(注释掉bos),看看能不能读2GB以上的数据?
  • “连接重置”表示远程对等体断开了连接。您的问题可能与 2 GB 大小无关,如果确实如此,则它在 sender 的方面。
  • 可能是服务器端超时。
  • Problems reading a huge file of 12 MB (java.lang.OutOfMemoryError) 的可能副本。它也是一个基于InputStream 的问题。

标签: java inputstream


【解决方案1】:

[SPACE] [ActiveMQ 会话任务] [createreviseswpart_0:69:1:1:1] 调试 10:33:55 (CreateReviseSWPart.java:348) - Checkin Exception::java.net.SocketException: Connection reset

查看 SocketException 的 javadoc 说明

抛出表示创建或访问 Socket 时出错。

这很可能是由 TCP 错误引起的。

在您的情况下,连接的服务器端似乎已关闭连接。这可能有很多原因......

尝试使用Wireshark 之类的工具调试网络流量以查看实际数据包。 您是否尝试过使用其他工具(wget/curl/a webbrowser?)访问 2GB 文件。

【讨论】:

    【解决方案2】:

    “连接重置”意味着连接在您的套接字上的活动中出现问题,“对等连接重置”意味着在另一个端点上,另一端(对等)已经退出标准协议告别握手

    这无助于确定真正的问题在哪里(如果它在代码中),但冷酷会将您带到正确的方向。

    Wireshark 可以帮助识别网络上“飞”的内容以及连接是否关闭。它适用于您的环境吗?

    另一个有趣的事情是监控是否有超时。

    2GB 是一个奇怪的维度,所以我更愿意建议您:

    如果两者都在 JAVA 中,2GB 可能是一个限制。内存(缓冲区)也可能是一个限制。我们假设对方没问题。


    2 GB 是与 Integer.MAX_VALUE 相关的 JVM 限制

    它并不为人所知,代码中的错误无处不在。

    在某些情况下,有一个解决方法http://todayguesswhat.blogspot.it/2012/07/file-download-java-servlet-example-2gb.html


    您的解决方案使用自定义数据包或关联队列分块......

    这可以解决长时间活动导致的超时,但缺点是吞吐量最差。

    【讨论】:

    • 这与连接重置错误有什么关系?可能远程服务器有这个限制(如果它正在运行 java),但上面显示的客户端代码应该可以正常工作吗?
    • @PeterLiljenberg "connection reset" 表示你端连接超时,"connection reset by peer" 表示另一端超时或因网络状况丢失
    • 备案,“connection reset”和“connection reset by peer”是同义词;一些平台上的一些代码路径报告一个,一些另一个。本地超时导致“操作/连接超时”,如果本地主动关闭连接,您将获得“流关闭”或“套接字关闭”。
    【解决方案3】:

    BufferedInputStream 接口对其索引和标记限制使用有符号整数,这意味着它的上限为 2gig 最大值(Integer.MAX_VALUE 字节)。如果您读取的文件大于该文件,它将翻转为负数,并且无法通过 marklimit 比较。

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 2011-08-31
      • 2012-10-14
      • 2019-12-19
      • 2012-03-12
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      相关资源
      最近更新 更多