
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するというような処理を書きたいのですが、どのようにすればよいでしょうか?
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 {
外のループを抜ける
}
}
なるほど、availableを回せばよかったんですね。
このアルゴリズムならsleepの時間もある程度、少なくすることができますね。
ありがとうございました。
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を使えば良いわ。
この回答への補足
すいません、少し説明不足でした。
InputStreamはある程度時間をかけて書き込まれるstreamなので、availableが0になるようです。
<<ThreadかTimerを使えば良いわ。
そのようなAPIがあるんですね。調べてみたら使えそうでした。ありがうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
テキストファイルの任意の文字...
-
InputStream.read()でタイムア...
-
csv出力について
-
FileクラスのcanRead/canWrite...
-
Windowsでの標準入力の終了の仕方
-
javaプログラミング
-
javaプログラミングの質問です。
-
java DAO 日付指定フォーマット...
-
オブジェクトの中のプロパティ...
-
ループ処理の際、最後だけ","を...
-
動的配列が存在(要素が有る)か...
-
System.err. printlnとSystem.o...
-
<forEach> 内で供給された "ite...
-
ORA-01858: 数値を指定する箇所...
-
0dの意味を教えてください
-
C言語のポインターに関する警告
-
IF関数でEmpty値を設定する方法。
-
VB.net 引数で配列変数を渡す際...
-
C#の質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
csv出力について
-
Javaでデータに登録する度にID...
-
[JAVA]エラーが解決できません。
-
Class.forNameでエラーになる
-
Java int sum = 0は必要ですか?
-
Javaの質問です。テキストファ...
-
javaプログラミングの質問です。
-
equalsの逆
-
ファイル読込みにおける改行表...
-
九九を横に表示する。
-
Servletでテキストボックスに入...
-
BufferedReaderでのエラー
-
Javaの質問です。テキストファ...
-
テキストファイルから空白行をよむ
-
文字列について(続き)
-
javaのfor文が機能してないみた...
-
Pleiades4.4でVectorの使用
-
printfを使って出力
-
ファイルの読み飛ばしが出来ま...
おすすめ情報