gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:37 24 4
gpt4 key购买 nike

我正在编写一个程序来从服务器下载非常大的文件 (~2GB)。我编写的程序能够恢复部分完成的下载,

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

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

我试图通过在另一个线程上调用 in.close() 来“中断”调用,但在互联网连接恢复之前它没有任何效果(此时抛出异常)。

有什么方法可以防止断开的互联网连接卡住我的程序?

最佳答案

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

不过,看起来 URLConnection 不允许您连接自定义 Socket 工厂。

也许你应该调查一下 HttpClient来自 Apache。

编辑

这是创建可中断套接字的方法。

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 示例,但我知道您可以自定义套接字初始化。

关于java - 如何终止 BufferedInputStream .read() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9041490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com