ホームページ > Java > &#&チュートリアル > タイムアウトのある Java InputStream から読み取る方法は?

タイムアウトのある Java InputStream から読み取る方法は?

Barbara Streisand
リリース: 2024-12-14 03:08:17
オリジナル
859 人が閲覧しました

How to Read from a Java InputStream with a Timeout?

タイムアウトのある InputStream からの読み取り

特定の問題には、カスタマイズされた解決策が必要です。この質問は、指定された制限時間内に InputStream からデータを取得するメソッドを構築することを目的としていますが、それを超えた場合はエラー コードが表示されて正常に失敗します。

Java の InputStream に関する具体的な考慮事項

この問題を解決するには、理解する必要があります。 Java の InputStream クラス:

  • その read() メソッドは通常は使用できません
  • InputStream を Reader クラスまたは InterruptibleChannel クラスにラップしても、使用可能なオプションは拡張されません。
  • available() はいつでも 0 を返す可能性があります。
  • close() はブロックまたはブロックする可能性があります。何もしません。
  • 別のスレッドを無条件に終了することはできません。

available() による入力可用性チェック

問題文の主張に反して、InputStream.available() は常に 0 を返すわけではありません。ブロックせずに利用可能なデータ。ただし、実際のデータ数は過小評価される可能性があります。

最も基本的な解決策

この単純なアプローチでは、ブロックやタイムアウトの制約が課せられません。

byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());
ログイン後にコピー

タイムアウト対応解決策

より細かく制御するには、メソッドで指定された範囲内の使用可能なデータをバッファーに充填できます。 timeout:

public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis)
     throws IOException  {
     int bufferOffset = 0;
     long maxTimeMillis = System.currentTimeMillis() + timeoutMillis;
     while (System.currentTimeMillis() < maxTimeMillis &amp;&amp; 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;
 }
ログイン後にコピー

ソリューション使用率

byte[] inputData = new byte[1024];
int readCount = readInputStreamWithTimeout(System.in, inputData, 6000);  // 6 second timeout
ログイン後にコピー

これは、ブロッキング入力ソースと非ブロッキング入力ソースの両方に対してタイムアウトを指定して、InputStream から読み取る方法を提供します。

以上がタイムアウトのある Java InputStream から読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート