java-如何终止BufferedInputStream .read()调用

我正在编写程序以从服务器下载非常大的文件(约2GB).我编写该程序是为了能够恢复部分完成的下载,

为了模拟不良的互联网连接,在下载过程中,我一直将以太网线从路由器中拉出.不幸的是,这导致我的程序挂起以下调用:
while((bytesRead = in.read(data))> 0)

(其中bytesRead是int,in是从HttpURLConnection构建的BufferedInputStream,而data是字节数组).

我试图通过在另一个线程上调用in.close()来“中断”该调用,但是在恢复Internet连接之前(此时引发异常),它没有任何作用.

有什么办法可以防止断开的Internet连接冻结程序?

解决方法:

我发现的唯一可靠的方法是将Socket实例化为InterruptibleChannel,并在卡住的IO线程上进行中断. (顺便说一句,您不必在InterruptibleChannels上使用异步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示例,但是我知道您可以自定义套接字初始化.

上一篇:解析Httpurlconnection获取响应


下一篇:如何通过Java从其下载链接获取文件扩展名?