
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ランキング
-
jdbcでinsert,delete,createをe...
-
プログラミングの問題です。大...
-
Googleログインボタンのデザイ...
-
JDONWROADER2のエラー修復
-
「main メソッドを持つクラスが...
-
Eclipse 動的プロジェクトで404...
-
正規表現について質問です。 カ...
-
スプレッドシートからリマイン...
-
googleスプレッドシートのスク...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JDONWROADER2のエラー修復
-
Googleログインボタンのデザイ...
-
配列にnullを代入すると、null...
-
jdbcでinsert,delete,createをe...
-
「main メソッドを持つクラスが...
-
プログラミングの問題です。大...
-
eclipseで作ったプログラムを他...
-
正規表現について質問です。 カ...
-
Eclipse 動的プロジェクトで404...
-
マイクラでPythonのプログラミ...
-
jdk17.06のインストーラーが起...
-
自作Androidアプリのデータ引き...
-
直し方について教えて頂きたい...
-
eclipse実行ができない
-
サーブレットをapacheで公開す...
-
あんまりお料理しないのに台所...
-
CSV出力を画面から選択したデー...
-
次のhtml・cssでspan内の文字を...
-
問題作成のWebアプリの作り方を...
-
ゲーム開発の入門書を探しています
おすすめ情報