• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:InputStream.read()でタイムアウトの処理をしたい。)

InputStream.read()でタイムアウトの処理をしたい

このQ&Aのポイント
  • InputStream.read()で固まる現象の解決方法についての質問です。
  • プログラムの性質上、InputStreamに入ってくるデータを変更することができないため、ある程度の時間でreadメソッドがブロックされた場合に処理を中断したいです。
  • どのようにすればタイムアウト処理を実装することができるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

そのInputStreamの実体がファイルなのかそれ以外なのかが分かりませんが、available()が適切に実装されているならこんな感じにしてみてはどうでしょうか。 while (true) { while (input.available()<=0) {  sleep()をはさみながらavailable()を繰り返し呼ぶ  一定の時間が経過したらあきらめて外のループを抜ける } if (0 < (n = input.read(buffer))) //available()が1以上なのでread()で固まることはないはず { output.write(buffer, 0, n); count += n; System.out.println(count + " byte = " + n); } else {  外のループを抜ける } }

lain_003
質問者

お礼

なるほど、availableを回せばよかったんですね。 このアルゴリズムならsleepの時間もある程度、少なくすることができますね。 ありがとうございました。

その他の回答 (1)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

package test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class Test { public static void main(String[] args) throws Exception { FileInputStream input = new FileInputStream(new File( "C:\\txt")); FileOutputStream output = new FileOutputStream(new File( "C:\\b.txt")); copy(input, output); } public static int copy(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[1024 * 4]; int count = 0; int n = 0; while (0 < (n = input.read(buffer))) // ここで固まる { output.write(buffer, 0, n); count += n; System.out.println("available = " + input.available()); System.out.println(count + " byte = " + n); } return count; } } で実行したけどまったく問題なく終わったわよ。 別のとことに原因があるんじゃないかしら? ちなみにJavaのバージョンは1.6.0_18よ。 > 時間 ThreadかTimerを使えば良いわ。

lain_003
質問者

補足

すいません、少し説明不足でした。 InputStreamはある程度時間をかけて書き込まれるstreamなので、availableが0になるようです。 <<ThreadかTimerを使えば良いわ。 そのようなAPIがあるんですね。調べてみたら使えそうでした。ありがうございます。

関連するQ&A