我想读的内容一URL但不想"挂"如果URL反应迟钝。我已经创建了一个BufferedReader用网址...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

...然后开始的循环读取内容...

do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

...但是如果读挂然后应用程序挂起。

有没有一种方法,而不磨代码下来插一级,以"时间"的读,如果有必要吗?

有帮助吗?

解决方案

我认为URLConnection.setReadTimeout是你在找什么。

其他提示

如果你有java1.4:

我假设连接的超时(URLConnection.setConnectTimeout(int timeout) )是没有用的,因为你是在做一些流。

---不杀线---它可能会导致未知的问题,公开的描述等。

产生一个java。工具.TimerTask,你会检查如果您已经完成的进程,否则,关闭BufferedReader和所使用的输出流的URLConnection

插入一个布尔的标志 isFinished 并将其设置为真正在结束你的循环,并假之前的循环

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

这可能会导致ioexception,所以你必须要抓住它。唯一的例外是不是一个糟糕的事情本身。我省略了一些声明(即总决赛)这样的匿名类可以访问您的变量。如果没有,那么创建一个组成维持一个参考,并传递到这timertask

由于Java1.5,就可能设置的读超时在毫秒的基础socket通过的'setReadTimeout(int timeout)'法在URLConnection类。

请注意,还有的'setConnectTimeout(int timeout)'这将做同样的事情的初始连接以远程服务器,所以,重要的是要设置这一点为好。

我已经在这个问题上的工作在一个JVM1.4环境只是在最近。股票的回答是使用系统性的太阳。网。客户。defaultReadTimeout(读超时)和/或太阳。网。客户。defaultConnectTimeout.这些都记录在 网络性能 并且可以通过设置的-D的论点Java命令行或通过一个系统。setProperty方法的呼吁。

据说这些都是缓存的执行情况所以你不能改变他们从一件事,另一个以一个他们一旦使用,值的保留。

他们也没有真正的工作SSL连接阿拉HttpsURLConnection.还有其他的方式来处理与使用定义SSLSocketFactory.

同样,所有这适用于JVM1.4.x.在1.5和你上面有更多的可用方法你在API(如指出其他行动者的上)。

Java1.4,你可以使用SimpleHttpConnectionManager.getConnectionWithTimeout(hostConf,CONNECTION_TIMEOUT)从Apache

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top