How can I set a timeout against a BufferedReader based upon a URLConnection in Java?我想读取 URL 的内容,但不想在 URL 无响应时"挂起"。我使用 URL 创建了一个 BufferedReader...
...然后开始循环读取内容...
...但如果读取挂起,则应用程序挂起。 有没有一种方法,无需将代码打磨到套接字级别,在必要时"超时"读取? 我认为 URLConnection.setReadTimeout 是您正在寻找的。 如果你有 java 1.4: 我认为连接超时 ( ---不杀线程---可能会导致未知问题,打开描述符等 生成一个 java.util.TimerTask,您将在其中检查是否已完成该过程,否则,关闭 BufferedReader 和 URLConnection 的 OutputStream 插入一个布尔标志
这可能会导致 ioexception,所以你必须抓住它。例外本身并不是一件坏事。 从 Java 1.5 开始,可以通过 URLConnection 类上的 'setReadTimeout(int timeout)' 方法在底层套接字上设置读取超时(以毫秒为单位)。 请注意,还有 'setConnectTimeout(int timeout)' 将对与远程服务器的初始连接执行相同的操作,因此设置它也很重要。 对于 Java 1.4,您可以使用来自 Apache 的 SimpleHttpConnectionManager.getConnectionWithTimeout(hostConf,CONNECTION_TIMEOUT) 我最近一直在 JVM 1.4 环境中处理这个问题。常用的答案是使用系统属性 sun.net.client.defaultReadTimeout(读取超时)和/或 sun.net.client.defaultConnectTimeout。这些记录在 Networking Properties 中,可以通过 Java 命令行上的 -D 参数或通过 System.setProperty 方法调用进行设置。 假设这些是由实现缓存的,因此您不能将它们从一种事物更改为另一种事物,因此它们被使用一次,值将被保留。 它们也不适用于 SSL 连接 ala HttpsURLConnection。还有其他方法可以使用自定义 SSLSocketFactory. 同样,这一切都适用于 JVM 1.4.x。在 1.5 及更高版本中,您可以在 API 中使用更多方法(如上述其他响应者所述)。 |