[英]How can I set a timeout against a BufferedReader based upon a URLConnection in Java?
我想讀取URL的內容,但如果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就是你要找的東西。
如果你有java 1.4:
我假設連接超時( URLConnection.setConnectTimeout(int timeout)
)是沒有用的,因為你正在做某種流式傳輸。
--- 不要殺死線程 ---可能會導致未知問題,打開描述符等。
生成java.util.TimerTask,您將檢查是否已完成該過程,否則,關閉URLConnection的BufferedReader和OutputStream
插入一個布爾標志isFinished
並在循環結束時將其設置為true,並在循環之前將其設置為false
TimerTask ft = new TimerTask(){
public void run(){
if (!isFinished){
urlConn.getInputStream().close();
urlConn.getOutputStream().close();
}
}
};
(new Timer()).schedule(ft, timeout);
這可能會導致ioexception,所以你必須抓住它。 這個例外本身並不是一件壞事。 我省略了一些聲明(即決賽),所以匿名類可以訪問你的變量。 如果沒有,則創建一個維護引用的POJO並將其傳遞給timertask
從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連接和HttpsURLConnection。 還有其他方法可以使用自定義SSLSocketFactory來處理它。
同樣,所有這些都適用於JVM 1.4.x. 在1.5及以上,您可以在API中使用更多方法(如上面其他響應者所述)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.