• ベストアンサー

InputStreamにたまったデータを消す方法

InputStreamにたまったデータを消す方法 私は現在勉強のためにsocketプログラミングをJavaでしているのですが困った事があります。それはInputStreamからreadでデータを読み込んでも、読み込んだデータはStream内に消えずに残っているため、処理が複雑になってしまいます。何かflushのようなstreamにたまったデータを吐き出すメソッドはないのでしょうか?

  • Java
  • 回答数2
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

ANo.1の者です。 > inStream.read(readByte, 0, 100); read()の返り値をチェックしていないのが気になります。 おそらくですが、2回目のread()では1バイトも読み込んでいないのでreadByte[]の内容が変わっていないのではないでしょうか。 ↓このようにしたらどうなりますか? n = inStream.read(readByte, 0, readByte.length); System.out.println("n = " + n); for(int i = 0;i < n;i++) { System.out.println("readByte" + i + " = " + readByte[i]); }

lain_003
質問者

お礼

なんどもお返事ありがとうございます。 言われたとおりにやってみると二回目はー1を吐いていました。 なので前のデータを表示させていただけだったんですか・・・。 初歩的なミスではずかしいです。しかしおかげさまで問題は解決できました。付き合っていただきありがとうございます。

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

> InputStreamからreadでデータを読み込んでも、読み込んだデータはStream内に消えずに残っているため 普通はそんな現象は起きないので流れてきたデータを順番にreadするだけですが、どういうプログラムでそういうことが発生しているのか示すことはできますか? なお、読み飛ばしたいバイト数が分かっているならばInputStream.skip()メソッドを使うこともできます。

lain_003
質問者

補足

お返事ありがとうございます。 簡単にプログラムを書かせていただきますと、 --------Server-------- OutputStream outStream; byte[] writeDataByte =new byte[6];//送るデータをbyteに変換した物 outStream.write(wirteDataByte); outStream.write(wirteDataByte); --------Server-------- --------Client-------- InputStream inStream;//markはsupportしていない byte[] readByte = new byte[100]; System.out.println("available = " + inStream.available());//結果は12 inStream.read(readByte, 0, 100); for(int i = 0;i < 100;i++) { System.out.println("readByte" + i + " = " + readByte[i]); } System.out.println("available = " + inStream.available());//結果は0 inStream.read(readByte, 0, 100); for(int i = 0;i < 100;i++) { System.out.println("readByte" + i + " = " + readByte[i]); } --------Client-------- このようなソースを動かすと、一回目の出力と二回目の出力が同じ内容になります。また私もavailableでデータの長さを読み取り、skipで後ろから送ったデータの分だけをとろうともしたのですが、二回目のavailableでは長さが0になっているため、うまくいきません。 お手数をお掛け致しますが、お返事よろしくお願いいたします。

関連するQ&A

  • InputStreamクラスの仕様

    InputStreamクラスのreadメソッドを使用しています。 InputStreamには1MBのデータがバイナリで格納されており、2KBずつ byte配列にreadメソッドを使用して格納する処理を行っています。 処理自体は問題なく終了するのですが、readメソッドを使用して8KBほど 読み込んだ後、決まってパフォーマンスが悪くなり100Bしか読み取れず、 また8KB読み込んで100B読み込むといった処理になってしまいます・・・。 これはInputStreamのreadクラスの仕様なのでしょうか?それとも何か対策があるのでしょうか? ちなみにInputStreamクラスの元ねたはHTMLにてmultipart/form-dataを使用して アップロードしたファイルデータが格納されています。

    • ベストアンサー
    • Java
  • InputStreamのread()関数

    InputStreamの関数 public abstract int read()throws IOException サブクラスはこの関数をオーバーライドする。 ところがFilterInputStreamはInputStreamを変数にもちread()を呼び出している。(↓を参照) http://java.sun.com/javase/ja/6/docs/ja/api/java/io/FilterInputStream.html#read() サブクラスでオーバーライドするなら、そもそも変数でInputStreamがもてる時点でおかしいわけです。 他にも同じようなものに Socket sock; InputStream is = sock.getInputStream(); これでなぜかis.read()が使える。

    • ベストアンサー
    • Java
  • InputStream.read()でタイムアウトの処理をしたい。

    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するというような処理を書きたいのですが、どのようにすればよいでしょうか?

    • ベストアンサー
    • Java
  • Socketの接続のタイムアウトを設定するには

    JavaでSocket通信をしようとおもっています。 Socketはnewするときにconnectもしてしまいまうらしいので 妙なIPアドレスを指定したりして、応答がもどってこないと すべてそこで止まってしまうとおもうのですが、 Timeoutをかける方法はないのでしょうか。 setSoTimeoutというメソッドはreadのときとかStreamに関してしか かけられないということが分かりました。 Socketのコンストラクタの引数にSocketImplを指定して、 Socket.setSoTimeoutしてから SocketImpl.connectすれば大丈夫かな、とおもっていたのですが、 setSoTimeoutはreadにしか効かない、と明記してあったので、無駄ですよね。 どこかに情報がないかと検索エンジンでも探してみたのですが、 見つかりません。もしかしてタイムアウトを設定するのは 一般的な方法ではないのかとも思えてきました。 ずーーーーっと接続にしにいくのを待ちつづけるしかないのでしょうか。 どのような設計(というか使うクラス?)をするべきなのか、 思い当たるかたがいらっしゃいましたら教えていただけないでしょうか。 よろしくお願い致します(__)

  • 戻り値の返し方

    java eclipseを使ってプログラミングを勉強しています。 通信のプログラムを作っているのですが、 データをwrite()メソッドやread()メソッドを使って 送受信するのですが、それらのメソッドが正常に動いたかの 確認をする必要があると考えました。 そのためには、戻り値を確認すればよいことが分かりました。 初歩的な質問で申し訳ないですが、どうやって戻り値を 確認すればよいでしょうか? アドバイスをお願いします。

    • ベストアンサー
    • Java
  • readメソッドについて

    初歩的な質問ですが, OutputStream out = socket.getOutputStream(); out.read(); : (何らかの処理が続く) : read()メソッドで送信されたバイトを読み込みますが, 送信側がデータを送信しない間はずっとout.read(); の前でプログラムの動作はストップしているのでしょうか?

    • ベストアンサー
    • Java
  • 戻り値について

    javaの勉強をしている者です。 初歩的な質問で申し訳ありませんが、 メソッドの戻り値を確認するためには、 returnをつかわければいけないですか? それとも、例えばread()だと、 ch=read();とすれば、データの次のバイトを取得する と思うんですけど、この方法でも戻り値を 確認したということになるのでしょうか? ちがうのであれば、説明していただけると幸いです。

    • ベストアンサー
    • Java
  • ソケットクラスのsetSoTimeoutについて

    少し前に、仕事で使用していたプログラムの中に Socket sc = new Socket(); sc.setSoTimeout(20000); としている記述がありました。これは何をやっているのだろうと 思いリファレンスを見てみたところ 「Socket に関連付けられた InputStream の read() 呼び出しが、その時間の間だけブロックされます。タイムアウトの期限が切れると、Socket がまだ有効であっても java.net.SocketTimeoutException が発行されます。」 という記述がありました。 read() 呼び出しが、その時間の間だけブロックされるという意味がよくわからないのですが どういうことでしょうか。 これはAさんがソケット通信して取得した結果を20秒の間に読み込まなければいけなくて、 Bさんはその20秒間ソケット通信ができないということでしょうか。

  • 複数のOutputStreamでサーバ側から送信されるデータを、クライアント側で区別する方法

    こんにちわ。 データの送受信を行う場合のStreamに関して質問があります。 サーバー・クライアントプログラムを組む場合に、サーバー側から複数のOutputStreamを開き、それをクライアント側で受け取る場合は、どのようにInputStreamを開けばよいのでしょうか? また、一対のOutputStreamとInputStreamでデータの送受信を行う場合に関しても、データの内容によってプログラムを分岐したい場合などどのようにすればいいのでしょうか? 現在URLConnectionクラスを利用して、データの送受信を行うプログラムを作成しているのですが、疑問に感じたので教えて頂きたいです。

    • ベストアンサー
    • Java
  • データを保存しておく処理を実装したい。

    javaを勉強している者です。Swingを使ってメーラを作っています。勉強に使っている本は「EclipseによるJava実用プログラミング」と「Java GUIプログラミング(1)」です。 一度受信したメールを保存しておく方法に、全く見当がつきません。普通そういった処理はどうやるものなのでしょうか?また、それを勉強するにあたりお勧めの書籍、ウェブページがあれば、教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう