タイムアウトのある InputStream からデータを読み取ることはできますか?
質問は、指定されたタイムアウト期間。このようなメソッド (maybeRead) は、割り当てられた時間内にデータが利用可能な場合は、InputStream の read() メソッドと同じ結果を返し、データが利用できない場合は -2 を返すことを目的としています。課題は、生成されたスレッドが実行中に確実に終了されるようにすることです。
Java InputStream の制限
潜在的な解決策を検討する前に、Java InputStream の特定の制限を認識することが重要です。
制限との戦い
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 サイトの他の関連記事を参照してください。