- ベストアンサー
InputStream.read()でタイムアウトの処理をしたい
- InputStream.read()で固まる現象の解決方法についての質問です。
- プログラムの性質上、InputStreamに入ってくるデータを変更することができないため、ある程度の時間でreadメソッドがブロックされた場合に処理を中断したいです。
- どのようにすればタイムアウト処理を実装することができるでしょうか?
- みんなの回答 (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 { 外のループを抜ける } }
その他の回答 (1)
- askaaska
- ベストアンサー率35% (1455/4149)
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を使えば良いわ。
補足
すいません、少し説明不足でした。 InputStreamはある程度時間をかけて書き込まれるstreamなので、availableが0になるようです。 <<ThreadかTimerを使えば良いわ。 そのようなAPIがあるんですね。調べてみたら使えそうでした。ありがうございます。
お礼
なるほど、availableを回せばよかったんですね。 このアルゴリズムならsleepの時間もある程度、少なくすることができますね。 ありがとうございました。