タイムアウト付きの InputStream からの読み取り
InputStream から読み取り、タイムアウトを指定することは可能ですか?はい、しかしそれは思ったほど単純ではありません。 InputStream.read() メソッドは中断不可能である場合があり、InputStream.available() メソッドはデータが利用可能な場合でも 0 を返す場合があります。
Sun のドキュメントでサポートされている事実
InputStream.available()
InputStream.available() を使用すると、ブロックせずに読み取ることができる推定バイト数が返されるはずですが、サブクラスがこのメソッドをオーバーライドする責任があることに注意することが重要です。実際には、具体的な入力ストリーム クラスは、available() に意味のある値を提供します。
警告
最も単純なソリューション (ブロックなし)
byte[] inputData = new byte[1024]; int result = is.read(inputData, 0, is.available());
より充実したソリューション (タイムアウト内のバッファーフィルを最大化)
public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis) throws IOException { int bufferOffset = 0; long maxTimeMillis = System.currentTimeMillis() + timeoutMillis; while (System.currentTimeMillis() < maxTimeMillis & bufferOffset < b.length) { int readLength = java.lang.Math.min(is.available(), b.length - bufferOffset); int readResult = is.read(b, bufferOffset, readLength); if (readResult == -1) break; bufferOffset += readResult; } return bufferOffset; }
以上がタイムアウトのある Java InputStream から読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。