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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) powershell で書いたプログラムでcd が動かない 5 2023/04/08 14:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
csv出力について
-
テキストファイルから空白行をよむ
-
Servletでテキストボックスに入...
-
equalsの逆
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
パソコンキーボードで時分秒を...
-
BOOL値を逆にしたい
-
ダブルクォーテーションのrepla...
-
<s:iterator>の値をリストで取...
-
C# 半角カナの文字化けについて
-
JSPやサーブレットでSystem.out...
-
ボタンのイベントで異なるウィ...
-
「例外 *** は対応する try 文...
-
Eclipseのコンソールを常に表示...
-
ORA-01858: 数値を指定する箇所...
-
[JAVA]try 内の変数を外で!?
-
Delphiで改行文字の置換がうま...
-
StrutsでJSPからListを受け取り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
equalsの逆
-
InputStream.read()でタイムア...
-
Java int sum = 0は必要ですか?
-
テキストファイルから空白行をよむ
-
csv出力について
-
[JAVA]エラーが解決できません。
-
Servletでテキストボックスに入...
-
Javaの質問です。テキストファ...
-
Javaでデータに登録する度にID...
-
ソケットを使ったサーバとクラ...
-
javaのfor文が機能してないみた...
-
java連結
-
ObjectInputStreamとStreamCorr...
-
テキストファイルにおいて任意...
-
Class.forNameでエラーになる
-
九九を横に表示する。
-
Javaの質問です。テキストファ...
-
javaでCSVの中身から最大値を表...
-
BufferedReaderでのエラー
おすすめ情報