2GB限制Java输入流
我能够从http位置读取小于2GB的文件。然而,若我试图读取大于2GB的文件,我会遇到异常。我没有完全阅读,而是分块阅读。下面是我的代码片段和异常消息。如果你有进一步的线索,请帮助我2GB限制Java输入流,java,inputstream,Java,Inputstream,我能够从http位置读取小于2GB的文件。然而,若我试图读取大于2GB的文件,我会遇到异常。我没有完全阅读,而是分块阅读。下面是我的代码片段和异常消息。如果你有进一步的线索,请帮助我 BufferedOutputStream bos = new BufferedOutputStream(os); URL url = new URL(fileName); LOGGER.debug(url.toString());
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“连接重置”表示连接在你的一端超时,“对等连接重置”表示它在另一端超时,或者由于网络条件而丢失记录,“连接重置”和“由对等方重置连接”是同义词;某些平台上的某些代码路径报告一个,另一些报告另一个。本地端超时会导致“操作/连接超时”,如果连接是在本地端主动关闭的,则会导致“流关闭”或“套接字关闭”。