3

我正在編寫一個程序從服務器下載非常大的文件(〜2GB)。我編寫的程序能夠恢復部分完成的下載,如何殺死一個BufferedInputStream .read()調用

爲了模擬糟糕的互聯網連接,我在中途下載時將我的以太網電纜從我的路由器中拔出。不幸的是,這將導致我的程序掛在下面的調用: while((bytesRead = in.read(data)) > 0)

(其中bytesRead是int,在從一個HttpURLConnection類建立了一個的BufferedInputStream和數據是一個字節數組)。我試圖通過在另一個線程上調用in.close()來「中斷」調用,但直到互聯網連接恢復(此時拋出異常)它才起作用。

有沒有什麼辦法可以防止斷斷續續的網絡連接凍結我的程序?

+2

還有類似的回答問題:http://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout – 2012-01-27 23:45:27

回答

1

你有沒有.setReadTimeout(int timeout)URLConnection

- 編輯

從@DNA

查看答案簡潔的解決方案:

在短話,你可以派生並行線程.disconnect() S中URLConnection(後讓你的第二個線程睡眠超時毫秒),從而觸發一個IOException,這將讓你擺脫停滯的閱讀。

+2

這是很好的做法,但如果服務器返回一些數據並且_then_卡住了,它將無濟於事 - 它只在服務器完全沒有返回數據的情況下起作用。 – DNA 2012-01-27 23:44:33

1

代碼見http://thushw.blogspot.com/2010/10/java-urlconnection-provides-no-fail.html來處理這種情況

編輯:實際上,設置使用setSoTimeout(比如從喬普埃根的鏈接評論建議)一個Socket超時時間(毫秒)可能是更好的。

+0

+1非常好的解決方案! – 2012-01-27 23:54:25

+0

我試過打電話了。斷開()從一個單獨的線程,但即使在調用後,沒有拋出IOException,所以我仍然卡住... – Samusaaron3 2012-01-28 00:03:31

+0

@ DNA爲了使用setSoTimeout你應該有一個套接字,但HttpURLConnection不允許你檢索它的底層套接字。 (我假設OP需要依賴HttpURLConnection) – 2012-01-28 00:18:35

2

我發現的唯一可靠的方法是將Socket實例化爲InterruptibleChannel,並在卡住的IO線程上執行中斷。 (順便說一句,你不必使用帶有InterruptibleChannel的異步NIO調用,阻止I/O工作正常,你只是有一個非常好的和統一的方式來踢卡住交易所)

雖然,它看起來像URLConnection不允許你連接一個自定義的Socket工廠。

也許你應該從Apache調查HttpClient

編輯

這裏是你如何建立可中斷插座。

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

+0

對於Apache HttpClient的+1 – 2012-01-28 00:25:32

+0

你有這樣的例子嗎?我一直在尋找相當長的一段時間,而且一直在尋找有用的東西時遇到困難。基本上我需要的是一種可靠的,可中斷的,可恢復的方式來下載非常大的文件(〜2GB)。我找不到任何相當於HttpURLConnection.setRequestProperty()... – Samusaaron3 2012-01-28 07:02:34

+0

@ Samusaaron3。我已經添加了一個如何創建interraptible套接字的示例。 – 2012-01-28 12:38:47