Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
2GB限制Java输入流_Java_Inputstream - Fatal编程技术网

2GB限制Java输入流

2GB限制Java输入流,java,inputstream,Java,Inputstream,我能够从http位置读取小于2GB的文件。然而,若我试图读取大于2GB的文件,我会遇到异常。我没有完全阅读,而是分块阅读。下面是我的代码片段和异常消息。如果你有进一步的线索,请帮助我 BufferedOutputStream bos = new BufferedOutputStream(os); URL url = new URL(fileName); LOGGER.debug(url.toString());

我能够从http位置读取小于2GB的文件。然而,若我试图读取大于2GB的文件,我会遇到异常。我没有完全阅读,而是分块阅读。下面是我的代码片段和异常消息。如果你有进一步的线索,请帮助我

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.

                    }
BufferedOutputStream bos=新的BufferedOutputStream(os);
URL=新URL(文件名);
debug(url.toString());
URLConnection=url.openConnection();
debug(“在获得100 MB的输入流之前,打开输入流::”+downloadFileName);
//BufferedInputStream in=新的BufferedInputStream(url.openStream());
InputStream in=url.openStream();
//InputStreamReader inReader=新的InputStreamReader(in);
//InputStream in=connection.getInputStream();
debug(“获取输入流后,打开inputstream::”+下载文件名);
//在。
//debug(“in1::”+in1);
最终字节[]缓冲区=新字节[100*1024*1024];//100Mb
while(true)
{
LOGGER.debug(“读取…”);
最终整型读取=整型读取(缓冲区);
LOGGER.debug(“读取…”);
如果(读取<0)
{
打破
}
LOGGER.debug(“编写…”);
写入(缓冲区,0,读取);
LOGGER.debug(“编写的…”);
//博斯。
}
[SPACE][ActiveMQ会话任务][CreateReviesWPart_0:69:1:1:1]调试10:33:55(CreateReviesWPart.java:348)-签入异常::java.net.SocketException:连接重置

查看javadoc中的SocketException,它指出

抛出以指示创建或访问套接字时出错

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

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

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


“连接重置”表示您的连接在套接字上出现问题,“对等连接重置”表示在另一个端点上,另一方(对等方)已退出告别握手的标准协议

这无助于确定真正的问题在哪里(如果它在代码中),但会引导您找到正确的方向

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

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

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

如果两者都在Java2GB中,则可能是一个限制。内存(缓冲区)也可能是一个限制。我们假设对方是好的


2GB是一个JVM限制,它与Integer.MAX\u值相关

它并不广为人知,代码中的bug无处不在。

在某些情况下,有一个解决办法


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


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

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

您是否能够/是否尝试更改JVM的最大堆大小?是否可以尝试读取而不写入它(注释掉bos)并检查它是否可以读取超过2GB的数据?“连接重置”表示远程对等方断开了连接。您的问题可能与2 GB大小无关,如果与2 GB大小无关,则是发送方的问题。可能是服务器端超时。可能是的重复。这也是一个基于
InputStream
的问题。这与连接重置错误有什么关系?远程服务器可能有这个限制(如果它运行java的话),但是上面显示的客户端代码应该可以正常工作?@PeterLiljenberg“连接重置”表示连接在你的一端超时,“对等连接重置”表示它在另一端超时,或者由于网络条件而丢失记录,“连接重置”和“由对等方重置连接”是同义词;某些平台上的某些代码路径报告一个,另一些报告另一个。本地端超时会导致“操作/连接超时”,如果连接是在本地端主动关闭的,则会导致“流关闭”或“套接字关闭”。