java.net.URL#openStream()はclient timeoutしない

JavaのSocket周りでは割とよくある感じですが、以下のコードだとconnectもreadもデフォルトで無限に待ち続ける挙動をします。

BufferedImage image = ImageIO.read(new URL(url).openStream());

Javadocをみると以下の通り。

Opens a connection to this URL and returns an InputStream for reading from that connection. This method is a shorthand for:
     openConnection().getInputStream()

実際、jdk1.6u18のソースを見るとopenConnection()してすぐにgetInputStream()しています。

public final InputStream openStream() throws java.io.IOException {
	return openConnection().getInputStream();
}

以下は適切にtimeoutさせる実装例です。URL#openStream()を使うのはやめてopenConnection()で取得したURLConnectionオブジェクトのsetterでタイムアウト値を設定します。

URLConnection conn = new URL(url).openConnection();
conn.setReadTimeout(1000);
conn.setConnectTimeout(1000);
conn.connect();
BufferedImage image = ImageIO.read(conn.getInputStream());

connect、readともに1000ミリ秒でSocketTimeoutExceptionを投げるようになります。