- ベストアンサー
java:読み込んだデータの確認
javaを使って通信のプログラムをつくっています。 送信側でバイトデータを作成して送信します。そして受信側でそのバイトデータを読み込みます。 送信側で作ったバイト数が本当に受信側に届いたかのチェックをするには、 どうすればよいでしょうか?下のコードは、自作した受信処理です。 調べると、read(byte[] b,int off,int len)の返り値が読み込んだバイト数ということなので、 これを使うのではないかと思うのですが、どう使えばよいか分かりません。下のコードは、とりあえず、受信したらcount++として受信処理分だけ countを増やして受信したバイトを数えています。 readの返り値で受信したバイト数を取得するには、どうすればよいでしょうか? 御教授お願いします。 送信側 BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); for (int i = 0; i < Data; i++) { for (;;) { try { out.write(i); out.flush(); count++; break; } catch (IOException e) { System.err.println((count + 1) + "つ目のバイト:書き込みエラー>>再書き込み"); } } } 受信側 BufferedInputStream in = new BufferedInputStream(sock.getInputStream()); int ch = 0; // 読み込んだ文字 int Count = 0; // 届いたバイト数のカウンター while (ch != -1) { try { ch = in.read(); Count++; } catch (IOException e) { System.err.println(Count + "つ目のバイトデータ:読み込みエラー"); } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
引数なしのread()ではなくてread(byte[],int,int)のほうを使いたいが、その使い方が分からないということですか? byte[] buf = new byte[適当なサイズ]; int n; int s = 0; while ((n = in.read(buf, 0, buf.length)) >= 0) { s += n; } 例外処理は適宜行ってください。 もっとも、こういう使い方なら3引数のread()ではなくて1引数のread()を使って n = in.read(buf) でも同じ意味なんですが。
その他の回答 (1)
- komi1341
- ベストアンサー率65% (25/38)
> 読み取るバイトがなくなるまでループさせて時間をはかっています。 > ですから、read()はバイトをひとつずつ読み取るためにも消去できないと思っています。 拝見した限り、一文字ずつ読み込む理由は単に、終端を現す文字's'を判定したいだけではないでしょうか? それなら一文字ずつ読み込むようなことはしなくとも、read(byte[],int,int)でバッファに読み込めたデータの最後の文字をチェックすれば済むので、引数なしread()は不要でしょう。 またメソッドの使い方ならAPIリファレンスを見れば書いてありますし、もっと具体的な例を見たければSUNのサイトのチュートリアルを見るか、「java read」のようなキーワードで検索すればいくらでもでてきます。自分でちょっと調べれば分かるようなことはご自身で解決できるようにされた方がよいと思います。以下は検索してすぐに見つかったサイト例です。 http://www.ep.u-tokai.ac.jp/~kikn/Java2003/text-IO.html
お礼
回答ありがとうございます。 なんとか解決しました。ありがとうございました。
お礼
回答ありがとうございます。 説明不足でしたので追加します。 受信時間を計測したいため、最初の質問欄に載せたコードに受信開始時間と終了時間のコードをつけています。次のようにしています。 System.out.println("受信開始時間を確認"); startNs = System.nanoTime(); while (ch != -1) { try { ch = in.read(); if(ch != -1) Count++; } catch (IOException e) { System.err.println(Count + "つ目のバイトデータ:読み込みエラー"); } if (ch == 's') { stopNs = System.nanoTime(); System.out.println("受信終了時間を確認"); } } 読み取るバイトがなくなるまでループさせて時間をはかっています。 ですから、read()はバイトをひとつずつ読み取るためにも消去できないと思っています。 上のコードのままで、read(byte[],int,int)を追加して読み込んだ総バイト数を 確認したいのです。 どのようにすればよいでしょうか?