アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

> InputStreamからreadでデータを読み込んでも、読み込んだデータはStream内に消えずに残っているため



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

この回答への補足

お返事ありがとうございます。

簡単にプログラムを書かせていただきますと、
--------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になっているため、うまくいきません。

お手数をお掛け致しますが、お返事よろしくお願いいたします。

補足日時:2010/06/14 22:47
    • good
    • 0

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]);
}
    • good
    • 0
この回答へのお礼

なんどもお返事ありがとうございます。

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

お礼日時:2010/06/15 02:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!