
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ランキング
-
javaのfor文が機能してないみた...
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
JSPやサーブレットでSystem.out...
-
JavaScriptの変数をjavaのメソ...
-
Formの値が変更されたかどうか...
-
javaです
-
オブジェクトの中のプロパティ...
-
VBSエラー"オブジェクト型の変...
-
C# DataGridView列カスタマイズ
-
IF関数でEmpty値を設定する方法。
-
ORA-01858: 数値を指定する箇所...
-
C#でのWNetAddConnection3の使...
-
変数を動的に作るには?
-
コマンドプロンプトに不正な文...
-
matchesを否定文として使う方法...
-
POIでExcelに時刻(h:mm)の値を...
-
java 入力 3 4 3 出力 ABC DEFG...
-
JMeterについて教えてください
-
C言語の変数(LSB)の合わせ込...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
csv出力について
-
yyyymmddからyyyy/mm/d...
-
テキストファイルから空白行をよむ
-
BufferedReaderでのエラー
-
Javaの質問です。テキストファ...
-
equalsの逆
-
戻り値を使用する呼出
-
JAVAでエラーがでる。
-
FileクラスのcanRead/canWrite...
-
Java 出席状況を表す文字列から...
-
Javaでデータに登録する度にID...
-
ファイルの読み飛ばしが出来ま...
-
九九を横に表示する。
-
javaのfor文が機能してないみた...
-
Javaの質問です。テキストファ...
-
Servletでテキストボックスに入...
-
java連結
-
java.lang.NoClassDefFoundErro...
-
拡張子の読み込み制限を設けた...
-
[JAVA]エラーが解決できません。
おすすめ情報