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 –

答えて

1

URLConnection.setReadTimeout(int timeout)がありますか?

- きちんとした解決のための@DNAからEDIT

参照の答え:短い言葉で

あなたはタイムアウトの2番目のスレッドをスリープさせる後(.disconnect()URLConnectionという並列スレッドを生成することができますミリ秒)、したがって、読み込まれた読み込みからあなたを奪うIOExceptionを引き起こします。

+2

これは良い習慣ですが、サーバーが何らかのデータを返し、_then_が立ち往生した場合には役に立ちません。サーバーがデータをまったく返さない場合にのみ機能します。 – DNA

1

編集この状況

を処理するコードのためのhttp://thushw.blogspot.com/2010/10/java-urlconnection-provides-no-fail.htmlを参照してください:実際には、(ジョープEggenからリンクコメントで提案されているよう)setSoTimeoutを使用して(ミリ秒単位)ソケットのタイムアウトを設定することは、おそらく良いです。

+0

+1非常に良い解決策! –

+0

私は呼び出しを試みました。私はまだスタックされています... – Samusaaron3

+0

@DNA setSoTimeoutを使うためにはSocketが必要ですが、HttpURLConnectionはあなたに許可しませんその基底のSocketを取得します。 (私はOPがHttpURLConnectionに依存する必要があると仮定しています) –

2

私が見つけた唯一の信頼できる方法はSocketInterruptibleChannelとしてインスタンス化し、スタックされたIOスレッドで割り込みを行うことです。 (BTWでは、InterruptibleChannelsで非同期NIO呼び出しを使用する必要はなく、I/Oのブロックは正常に機能します)。

URLConnectionのように見えますカスタムのSocketファクトリを接続することができます。

ApacheからHttpClientを調べてください。ここで

EDIT

あなたが割り込み可能ソケットを作成する方法です。

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

+1 Apache HttpClientの場合 –

+0

これの例はありますか?私はしばらくの間探していましたが、何か役に立つものを見つけるのに苦労しました。私が必要とするのは、非常に大きなファイル(〜2GB)をダウンロードするための、信頼性の高い、中断可能な、再開可能な方法です。私はHttpURLConnection.setRequestProperty()に相当するものを見つけることができません... – Samusaaron3

+0

@ Samusaaron3。私はインタラプタブルなソケットをどのように作成するかの例を追加しました。 –

関連する問題