我能够从http位置读取小于2GB的文件。但是,如果我尝试读取大于2 GB的文件,我会得到异常。我不是完全阅读而是大块阅读。以下是我的代码段和异常消息。如果你有进一步的线索,请帮助我
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.
}
答案 0 :(得分:0)
[SPACE] [ActiveMQ Session Task] [createreviseswpart_0:69:1:1:1] DEBUG 10:33:55(CreateReviseSWPart.java:348) - Checkin Exception :: java.net.SocketException:Connection reset
查看SocketException的javadoc,它声明了
抛出表示创建或访问套接字时出错。
这很可能是由TCP错误引起的。
在您的情况下,似乎连接已被连接的服务器端关闭。这可能有很多原因......
尝试使用Wireshark之类的工具调试网络流量,以查看实际数据包。 您尝试使用其他工具(wget / curl / webbrowser?)访问2GB文件。
答案 1 :(得分:0)
&#34;连接重置&#34;表示连接在插槽上的侧面活动中出现问题,&#34;连接由同行重置&#34;意味着在另一端和那边另一边(对等方)已经超出了再见握手的标准协议
这无助于确定真正问题的位置(如果它在代码中),但冷却会将您带到正确的方向。
Wireshark可以帮助识别飞行中的内容&#34;飞行&#34;在网上,如果有连接关闭。它适用于你的环境吗?
其他有趣的事情是监视是否有一些超时。
2GB是一个奇怪的维度,所以我建议你:
如果两者都在JAVA 2GB可能是一个限制。内存(缓冲区)也可能是一个限制。我们假设另一方没问题。
2 GB是与Integer.MAX_VALUE
相关的JVM限制<强>它&#39;众所周知,代码中的错误无处不在。
在某些情况下,有一种解决方法http://todayguesswhat.blogspot.it/2012/07/file-download-java-servlet-example-2gb.html
您的解决方案使用自定义数据包或关联队列分成块...
这可以解决长时间活动导致的超时,但存在吞吐量最差的缺点。
答案 2 :(得分:0)
BufferedInputStream接口使用有符号整数作为其索引和marklimit,这意味着它的最大上限为2gig(Integer.MAX_VALUE字节)。如果您读取的文件大于该文件,则会翻转为负数并且无法进行标记限制比较。