3

我正在编写一个程序从服务器下载非常大的文件(〜2GB)。我编写的程序能够恢复部分完成的下载,如何杀死一个BufferedInputStream .read()调用

为了模拟糟糕的互联网连接,我在中途下载时将我的以太网电缆从我的路由器中拔出。不幸的是,这将导致我的程序挂在下面的调用: while((bytesRead = in.read(data)) > 0)

(其中bytesRead是int,在从一个HttpURLConnection类建立了一个的BufferedInputStream和数据是一个字节数组)。我试图通过在另一个线程上调用in.close()来“中断”调用,但直到互联网连接恢复(此时抛出异常)它才起作用。

有没有什么办法可以防止断断续续的网络连接冻结我的程序?

+2

还有类似的回答问题:http://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout – 2012-01-27 23:45:27

回答

1

你有没有.setReadTimeout(int timeout)URLConnection

- 编辑

从@DNA

查看答案简洁的解决方案:

在短话,你可以派生并行线程.disconnect() S中URLConnection(后让你的第二个线程睡眠超时毫秒),从而触发一个IOException,这将让你摆脱停滞的阅读。

+2

这是很好的做法,但如果服务器返回一些数据并且_then_卡住了,它将无济于事 - 它只在服务器完全没有返回数据的情况下起作用。 – DNA 2012-01-27 23:44:33

1

代码见http://thushw.blogspot.com/2010/10/java-urlconnection-provides-no-fail.html来处理这种情况

编辑:实际上,设置使用setSoTimeout(比如从乔普埃根的链接评论建议)一个Socket超时时间(毫秒)可能是更好的。

+0

+1非常好的解决方案! – 2012-01-27 23:54:25

+0

我试过打电话了。断开()从一个单独的线程,但即使在调用后,没有抛出IOException,所以我仍然卡住... – Samusaaron3 2012-01-28 00:03:31

+0

@ DNA为了使用setSoTimeout你应该有一个套接字,但HttpURLConnection不允许你检索它的底层套接字。 (我假设OP需要依赖HttpURLConnection) – 2012-01-28 00:18:35

2

我发现的唯一可靠的方法是将Socket实例化为InterruptibleChannel,并在卡住的IO线程上执行中断。 (顺便说一句,你不必使用带有InterruptibleChannel的异步NIO调用,阻止I/O工作正常,你只是有一个非常好的和统一的方式来踢卡住交易所)

虽然,它看起来像URLConnection不允许你连接一个自定义的Socket工厂。

也许你应该从Apache调查HttpClient

编辑

这里是你如何建立可中断插座。

import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
import java.nio.channels.SocketChannel; 

final SocketAddress remoteAddr = 
    new InetSocketAddress(
     serverAddress, 
     servicePort 
    ); 

final SocketChannel socketChannel = SocketChannel.open(); 

socketChannel.connect(remoteAddr); 

// Here java.io.Socket is obtained 
Socket socket = socketChannel.socket(); 

我没有HttpClient示例,但我知道您可以自定义套接字初始化。

+0

对于Apache HttpClient的+1 – 2012-01-28 00:25:32

+0

你有这样的例子吗?我一直在寻找相当长的一段时间,而且一直在寻找有用的东西时遇到困难。基本上我需要的是一种可靠的,可中断的,可恢复的方式来下载非常大的文件(〜2GB)。我找不到任何相当于HttpURLConnection.setRequestProperty()... – Samusaaron3 2012-01-28 07:02:34

+0

@ Samusaaron3。我已经添加了一个如何创建interraptible套接字的示例。 – 2012-01-28 12:38:47