- ベストアンサー
0バイトの送信
PrintWriterで終端0バイトになるように送信 したいのですが、疑問があります。 myprintwriter.println("こんにちは\0"); だと、うまくいかないのですが、 myprintwriter.println("こんにちは\0"); myprintwriter.flush(); と、flush()をつけるとうまくいきます。 このflush()はどういう意味なのでしょうか。 ついでですが、printlnだと、最後に改行がつき、 0バイトにならないような気もするのですが、 なぜ、大丈夫なのでしょうか。 なにか分かる人、お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
・flush()の意味 バッファの内容をすべて書き出す という意味です。 WriterやOutpuStreamはパフォーマンスをあげるためにに出力内容をバッファに溜めておき、一気に出力する仕組みになっているものが多いです。flush()はそのバッファの内容出力の処理を明示的に呼び出せます。 これを呼び出さない場合、出力はしばらくの間メモリ上に蓄えられたままになる可能性があります。 http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/Writer.html http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/PrintWriter.html ・最後に改行がつき、0バイトにならない 相手方のシステムによりますが、考え方が逆ではないかと思います。 「文字の終端を\0にする」ではなく「\0を文字の終端とみなす」では無いでしょうか。\0の後にあるものは無視されることになっているのでしょう。 C言語などのサイトで「Null文字」や「終端文字」などで調べてみると関係する資料が出てくると思います。
その他の回答 (2)
- liar_adan
- ベストアンサー率48% (730/1515)
「0バイトの送信」と書かれていますが、 やりたいことは、「\0」を送信したいということですね? バイトの値が0という意味で、「0バイト」と言っても まちがいとは言えませんが、これだと「長さが0の送信」 と思われる危険性があります。 この場合、「\0の送信」もしくは「ヌル文字の送信」 と表現した方がわかりやすいでしょう。 Javaの文字列はCと違って\0をターミネータとしているわけではないので、 "こんにちは\0" と "こんにちは" は違った文字列になります。 flush()というのは、文字列を書き出す意味があります。 バッファされている(細切れに出力をすると効率が悪くなるので、 内部である程度貯めて、一度に書き込むようにしている)出力ストリームでは、 flush()させることで実際の書き込みが行われます。 println()だと、実際に最後に改行がつくと思います。 それが嫌なら、print()のほうを使えばいいでしょう。 (java.io.PrintWriter参照) もし、改行がつくのに動作が正常であるというならば、 受け取る側で「\0があったところまでを文字列と見なし、 あとのデータは読み捨てている」からではないでしょうか。
- ggaogg
- ベストアンサー率43% (38/88)
"abc" のようにダブルクォーテション(文字列)にすると、自動的に最後に\0がつけられるはず。(少なくともCでは) (char[4])('a','b','c','\0') のようなかんじに。 だから"abc\0"と書くと (char[5])('a','b','c','\0','\0') となって、意味がないってことです。 本の裏表紙(終端)が2枚あるような変な感じですね。 #1さんの言われているのはこんなかんじかな。(#1さんは調べろと言っていましたが、理解するのに1日かかりそうなので・・)(いやしかし、自分の説明ではとうてい理解できないかも・・) ところで質問なんですけど・・題名は「0バイトの送信」となってますけど、0バイトって、なんのことですか? ナル文字は1バイトですよね?、もしかして表現として0バイト文字と表されるとかですか?
お礼
ありがとうございます。 flushに対するイメージが変わりました(バッファ にためて送るタイプには必須)。 また、\0は確かに改行前で、一応読み終えている 動きをしました("こんに\0ちは"で実験)。