web-dev-qa-db-ja.com

URLConnection.setReadTimeout()を理解する

次のスニペットを考えてみましょう:

URLConnection connection = target.openConnection();

connection.setConnectTimeout(5000); // 5 sec
connection.setReadTimeout(10000); // 10 sec

connection.setReadTimeout読み取りデータの開始に使用できる最大時間を設定しますか、それとも読み取りデータの完了に使用できる最大時間ですか?

私の理解はそれで、Javaは接続からデータの次のバイトの読み取りを開始するまでに10秒あります。接続からのすべてのデータの読み取りを終了するためのタイムアウトはありません。ストリアンは大きいかもしれません。

18
lviggiani

Oracleのドキュメントによると、読み取りタイムアウト期間に使用できるデータがない場合、例外がスローされる可能性があります

データが読み取り可能になる前に読み取りタイムアウトが期限切れになると、返された入力ストリームから読み取るときにSocketTimeoutExceptionがスローされることがあります。

9
Pesho

読み取りデータを「開始」するためのものです。タイムアウトは、着信データの待機時間の長さを制限するためにあります。読み取り可能なデータがある場合、タイムアウトは適用されません。

タイムアウトが期限切れになる前に読み取り可能なデータがある場合Java.net.SocketTimeoutExceptionが発生します。」

Oracleリファレンス

要するに-あなたの理解は正しいです。

12
Andrew_CS

あなたが正しいです! connection.setReadTimeout読み取りが完了したことを意味するのではなく、10秒間待機して、データが読み取られなくなったときに、timeoutexceptionがスローされることを意味します。

5
Sam