dポイントプレゼントキャンペーン実施中!

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

現在自分は、InputStreamに入力されたデータをOutputStreamに移したいとかんがえているのですが、途中でreadメソッドが固まってしまいうまくいきません。
ソースで説明させていただきますと、
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;
}
このようなコピーするメソッドを書いたのですが、何度かループした後readメソッドで固まってしまいます。また、availableは常に0を返しております。
おそらくストリームの終わりが検出できないため、このような状態になっていると推測されるのですが、プログラムの性質上、InputStreamに入ってくるデータを変更することはできません。
なのでこの問題を解決するべく、ある程度の時間readメソッドがブロックされたら、breakするというような処理を書きたいのですが、どのようにすればよいでしょうか?

A 回答 (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 {
 外のループを抜ける
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/08/16 21:21

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があるんですね。調べてみたら使えそうでした。ありがうございます。

補足日時:2010/08/16 21:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!