我怎么可以设置一个超时对BufferedReader根据URLConnection在Java?
题
我想读的内容一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