• ベストアンサー

0バイトの送信

PrintWriterで終端0バイトになるように送信 したいのですが、疑問があります。 myprintwriter.println("こんにちは\0"); だと、うまくいかないのですが、 myprintwriter.println("こんにちは\0"); myprintwriter.flush(); と、flush()をつけるとうまくいきます。 このflush()はどういう意味なのでしょうか。 ついでですが、printlnだと、最後に改行がつき、 0バイトにならないような気もするのですが、 なぜ、大丈夫なのでしょうか。 なにか分かる人、お願いします。

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

  • ベストアンサー
  • deadlock
  • ベストアンサー率67% (59/87)
回答No.1

・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)
回答No.3

「0バイトの送信」と書かれていますが、 やりたいことは、「\0」を送信したいということですね? バイトの値が0という意味で、「0バイト」と言っても まちがいとは言えませんが、これだと「長さが0の送信」 と思われる危険性があります。 この場合、「\0の送信」もしくは「ヌル文字の送信」 と表現した方がわかりやすいでしょう。 Javaの文字列はCと違って\0をターミネータとしているわけではないので、 "こんにちは\0" と "こんにちは" は違った文字列になります。 flush()というのは、文字列を書き出す意味があります。 バッファされている(細切れに出力をすると効率が悪くなるので、 内部である程度貯めて、一度に書き込むようにしている)出力ストリームでは、 flush()させることで実際の書き込みが行われます。 println()だと、実際に最後に改行がつくと思います。 それが嫌なら、print()のほうを使えばいいでしょう。 (java.io.PrintWriter参照) もし、改行がつくのに動作が正常であるというならば、 受け取る側で「\0があったところまでを文字列と見なし、 あとのデータは読み捨てている」からではないでしょうか。

noname#10667
質問者

お礼

ありがとうございます。 flushに対するイメージが変わりました(バッファ にためて送るタイプには必須)。 また、\0は確かに改行前で、一応読み終えている 動きをしました("こんに\0ちは"で実験)。

全文を見る
すると、全ての回答が全文表示されます。
  • ggaogg
  • ベストアンサー率43% (38/88)
回答No.2

"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バイト文字と表されるとかですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SocketでXMLオブジェクトを送信したい

    SocketでXMLオブジェクトを送信するにはどうしたら いいのでしょうか。 たとえば、 PrintWriterのprintln("<?xml ~><name></name>") では、XMLオブジェクトを送信したことにはならない ようです。 文字列をXMLに変換するメソッドがあるのか、 その場合の送信は、PrintWriterでできるのか、 とか、分かる人がいましたら教えてください。

  • 0バイト文字の送信

    C#ですが、C/C++でも同じだと思うので、 お願いします。 たとえば、"abcde"という文字を、終端文字0バイト として、送信したいのですが、どうしたらいいので しょうか。 string mys="abcde"; byte[] mybyte=new byte[1024]; mybyte=Encoding.UNICODE.GetBytes(mys); mynetwork.Write(mybyte,0,mybyte.Length); こんな感じで、書き出すつもりですが、終端が、 0バイトには、なっていないようです。 (ちなみに、JAVAだと、文字列を、送るので "abcde\0"で、うまくいきます。バイト配列で 送る場合が、わかりません。 分かる人がいましたら、お願いします

  • 0byteデータの送信と受信

    現在unixでsocketプログラムを書いています。 FTPライクなプログラムを書いているのですが、ファイルを送受信する場合、ファイルの終端をどうするかを考えています。 ファイルサイズを送るのはなしです。 sendで0byteのデータを送り、recvで0byteのデータを受信した場合にファイルの終端に達したとして処理を終らせたいと考えています。 実際、sendでは0byteのデータを送信してもエラーにはなりませんが、recvでは受信できません。 そのような処理はできるのでしょうか? よろしくおねがいします。

  • 送信バイト数 と 流量

    動画の 月間 送信バイト数 と 月間 流量 とは 同じ意味でしょうか? また、違う場合はご教授いただきますようお願いします。

  • 処理方法について

    こんにちは。 独学でjavaの勉強をしているのですが、 演習問題で分からないところがあります。 ファイルへの書き込みをする問題なのですが、 public void kakikomi(){ try { FileOutputStream out=new FileOutputStream("output.txt"); PrintWriter writer=new PrintWriter(out); writer.println(seibetu); writer.println(nenrei);   writer.println(taijuu); writer.println(sintyou); writer.flush(); writer.close(); }catch (FileNotFoundException e) {} } mainよりオブジェクトを作成しそれぞれの変数に(seibetu,nenrei...)値を入れファイルへ書き込みをするプログラムです。 上記のプログラムの場合性別を入れファイルを閉じる、身長を入れファイルを閉じるという作業をしているため 結果的に最後の項目である身長の値のみしかファイルに書き込み 出来ません。 どのようにすれば全ての項目をファイルに書き込むことが出来るでしょうか? よろしくお願いします。

  • 受信バイト数と送信バイト数

    インターネットに接続(アナログ回線)後、受信バイトと送信バイトが全く上がらなくなり“サーバーが見つかりません”とエラーメッセージが出ます。 何か設定が間違っているのでしょうか? 気のせいかもしれませんが31,200bpsで接続している時だけは順調な気がします。 普段は52,000bpsで接続していることがほとんどです。 お知恵をお貸しください。。。

  • バイトで出逢い、付き合うこと

    夏になり、学生はだんだん夏休みに入る頃ですね。 僕は今年が学生生活で最後の夏休みです。 だから楽しく過ごしたいと思っていて、 今まで彼女ができたことがないので 今年の夏はできると良いなと思っています! だけど質問が出てきたのでお願いします。 バイトとかサークルとかって一番出逢いがある場だと思っています。 そして出逢いが多いことは、恋愛状態になりやすいと思っています。 僕はサークルは入ってませんがバイトしています。 でもなかなか恋愛とかまでいきません。 自分が積極的にしてないのは原因の一つかもしれませんけど それでもバイトしてる人たちも、誰が好きとか付き合ってるという話は聞きません。 バイトは男女合わせて5、60人くらいいるバイトなのに バイト内では4カップルしかなくて、バイト外で付き合ってる人もいるみたいですが、 外見内面良いのに彼氏・彼女がいない人も多いです。バイト内では楽しいし仲は良いです。 一応、僕にも気になってる人がバイトにいますが 彼女は僕を尊敬・信頼できる存在のようで仲間として好きな程度みたいだし、 今のバイトでは望みがないのかなと感じています。 だからバイトは出逢いはあっても恋愛にならない場所なのかなと疑問を感じています。 バイトで(恋愛としての)出逢いってあまりなくて、恋愛状態になりにくいのでしょうか? 彼女ができたら良いなと思っていても現状だとできないと思うので、 変えなきゃいけないと思っています。 だけどもっと出逢いが多いバイトをするべきなのか、 今のバイトでがんばって恋愛状態になれるようにがんばるべきなのか、 それとももう無理なのか、どうしていいのかわからないので質問しました。 もちろんバイトは仕事してお金稼ぐ場所です。 だけど、過去の質問見たり、本(雑誌)やネットでは 「出逢いはバイトにある」という様なことを見かけたので知りたくなりました。 長文となってしまいましたが、最後まで読んで下さってありがとうございます。 回答よろしくお願いいたします。

  • メールのグループ送信のデメリット

    私の場合メアドは本当に親しい人にしか教えてないのに先日、あまり関わりたくない「Aさん」からメールが届きました。聞くと「グループ送信でお前らしきアドレスが載っていたから・・・」との事。 以前から疑問だったのですが、グループ送信で送った人のアドレスが分かってしまうのは如何なものでしょう?個人情報ですよね? 携帯では設定により宛名を「To」から「Bcc」に切り替えることで送信相手には誰に送ったか分からなくできます。それでも、例えば5人に送った場合一人だけ(送信先の一番に入力した人)は「To」の設定が変えられないので残りの4人は(送信先の一番に入力した人の)アドレスを知ってしまいます。 ↑私の言いたいこと、伝わってますか??ゴメンなさい、ややこしいですね。 つまり、グループ送信で送った人のアドレスが分かってしまうメリットとは何だと思いますか?私は意味ないし、迷惑なだけだと思います。 あと、ついでに聞きたいのですが、グループ送信で10人に送ってもパケット代金は1人分(1回分)って本当ですか?

  • streamで送信されたArrayListを変換したい

    以前ネットワークプログラミングについて質問したものです。 現在もjavaでソケットを使ったネットワークプログラミングを行っています。 現在、クライアントからサーバーに数値を送ってサーバーのArrayListのPOINTに格納しています。 そして、そのPOINTをstreamをつかってクライアントに送ってそのリストをクライアント側のArrayListに格納し、数字を出力しようと思っています。 しかし受け取ったPOINTをクライアント側のArrayListに格納しようとしても型が違う(stringだから)ので、うまく変換したいのですがうまくいきません。 送られてきたものをうまく型変換しクライアントのArrayListに格納する、また送信時にうまくArrayListを送信しクライアントで受信する方法はないでしょうか? サーバー PrintWriter out = new PrintWriter(((Socket) e.nextElement()).getOutputStream()); out.println(POINT); クライアント BufferedReader in; buff = in.readLine(); StringTokenizer st = new StringTokenizer(line); String cmd = st.nextToken(); CLPOINT = cmd; このような形で送信しています。 よい方法があればよろしくお願いします。

    • ベストアンサー
    • Java
  • javaにおけるCSV出力時の文字コード改行コード

    JavaでCSVを出力する処理を作りました。 下記コードだとUnix環境で文字コードSJISで改行コードLFで出力されますが、 Windows環境でもUnix環境でも一律、文字コードSJISで改行コードCRLFで出力されるようにしたいです。 何かいい方法はありませんでしょうか。 なお、printlnで出力している行が多い為、 bw,Print("日付" + 変数A + \r\n); というふうに一行づつ変更するのは避けたいと思っております。 try{ PrintWriter bw = new PrintWriter(new BufferdWriter(new OutputStreamWriter(new FileOutputStream(/tmp/test.csv),"SJIS"))); bw.println("日付" + 変数A); bw.println("氏名" + 変数B); ・ ・ ・ }catch(Exception e){ // ログに出力 }

    • ベストアンサー
    • Java
このQ&Aのポイント
  • Windows11に無料ダウンロードした後、TS8330のディスクで再度セットアップを行っても完了しない問題が発生しています。
  • TS8330のダウンロードがWindows11で行えない状況になっています。再度セットアップを試みても完了しない問題が発生しています。
  • Windows11への無料ダウンロード後、TS8330のディスクを使用して再度セットアップしてもダウンロードが完了しない状況です。
回答を見る