ホームページ >Java >&#&チュートリアル >Java の InputStream はタイムアウトで読み取ることができますか?またその方法は?

Java の InputStream はタイムアウトで読み取ることができますか?またその方法は?

DDD
DDDオリジナル
2024-12-25 18:21:15319ブラウズ

Can Java's InputStream be Read with a Timeout, and How?

タイムアウトのある InputStream からデータを読み取ることはできますか?

質問は、指定されたタイムアウト期間。このようなメソッド (maybeRead) は、割り当てられた時間内にデータが利用可能な場合は、InputStream の read() メソッドと同じ結果を返し、データが利用できない場合は -2 を返すことを目的としています。課題は、生成されたスレッドが実行中に確実に終了されるようにすることです。

Java InputStream の制限

潜在的な解決策を検討する前に、Java InputStream の特定の制限を認識することが重要です。

  1. read() は中断不可能であり、データ中の中断を防ぐことができます。 retrieval.
  2. Reader または InterruptibleChannel での InputStream のラップは、InputStream メソッドのみに依存するため、解決策はありません。
  3. available() は、データが存在する場合でも、合法的に 0 を返すことができます。
  4. close() はブロックされるか、効果がありません。
  5. 他のものを終了するための固有のメカニズムは存在しません。

制限との戦い

InputStream.available() の利用

ドキュメントには利用可能と記載されているにもかかわらず() は 0 を返す可能性があり、利用可能なデータの正確な推定値が得られることを示す証拠があります。具体的な InputStream サブクラスは、available() を戦略的にオーバーライドして、意味のある情報を提供します。

プラットフォーム固有の注意事項

Windows/Cygwin: 入力は、次の場合にのみ提供されます。 「戻る」を押します。それ以外の場合、InputStream.available() は期待どおり 0 を返します。

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

byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());  // Reads as much data as immediately 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;
 }

使用:

byte[] inputData = new byte[1024];
int readCount = readInputStreamWithTimeout(System.in, inputData, 6000);  // 6 second timeout

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

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