ホームページ >Java >&#&チュートリアル >タイムアウトのある Java InputStream から読み取るにはどうすればよいですか?

タイムアウトのある Java InputStream から読み取るにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-19 22:12:10220ブラウズ

How Can I Read from a Java InputStream with a Timeout?

タイムアウト付きの InputStream からの読み取り

InputStream から読み取り、タイムアウトを指定することは可能ですか?はい、しかしそれは思ったほど単純ではありません。 InputStream.read() メソッドは中断不可能である場合があり、InputStream.available() メソッドはデータが利用可能な場合でも 0 を返す場合があります。

Sun のドキュメントでサポートされている事実

  1. InputStream.read() は
  2. Reader または InterruptibleChannel を使用しても役に立ちません。
  3. InputStream.available() は常に 0 を返すことができます。
  4. InputStream.close() はブロックまたは何もしません。
  5. 他人を殺す一般的な方法はありませんthread.

InputStream.available()

InputStream.available() を使用すると、ブロックせずに読み取ることができる推定バイト数が返されるはずですが、サブクラスがこのメソッドをオーバーライドする責任があることに注意することが重要です。実際には、具体的な入力ストリーム クラスは、available() に意味のある値を提供します。

警告

  1. Windows で入力を入力するときは、必ずキャリッジ リターンを使用してください。
  2. InputStream.available() は、データが利用可能になるまで 0 を返します。 shell.

最も単純なソリューション (ブロックなし)

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。