readLine()の動作についての疑問

このQ&Aのポイント
  • readLine()の終端時にnullを返すため、文字列の最後や一行目の読み込みができないことを確認しました。
  • 発言の終わりを待つ方法として、nullが返されるまでループさせ、文字列を結合してから送信する方法が考えられます。
  • 簡単に発言単位で送信する方法はありませんが、nullを受け取ったら送信する方法が比較的簡単な解決策です。
回答を見る
  • ベストアンサー

readLine()の動作(改行と終端)

readLine()についてですが。 readLine()が終端時にnullを返すということは、 一行の文字列や、最終行はそのままでは 文字列を読み込めない、と理解していいのでしょうか (書き出すほうで、printlnや改行\nなどを付け足す必要あり)。 また、チャットなどで、サーバーが発言を待つ場合、 while(true){ string=buf.readLine(); mychat.sendall(string); } としますが、 これだと、行の終わりと、発言の終わりが、 区別できなくなってしまいます。 できたら、発言の終わり(終端)を待って、文字列 を作成し、行単位でなく、発言単位で、送信した いのですが。 (nullになるまでループさせ、その間、文字列を +で足して行き、nullを受けたら、送信する、 という方法もありそうですが、もっと簡単に できないでしょうか)。 お願いします。

noname#10667
noname#10667
  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。 >readLine()が終端時にnullを返すということは、 >一行の文字列や、最終行はそのままでは >文字列を読み込めない、と理解していいのでしょうか  これは試してみるとわかると思いますが、一行の文字列だろうと最終行だろうと、問題なく読み込めます。  ファイルの終端に達すると、それまでを一行として返し、その後で再びReadLine()が呼ばれるとnullを返します。 >string=buf.readLine();  このbufはBufferedReaderでその先はSocketのInputStreamにつながっているということですよね? >これだと、行の終わりと、発言の終わりが、 >区別できなくなってしまいます。 >nullになるまでループさせ  ソケット通信でEOFって出てきましたっけ?  SocketクラスのshutdownInput()を呼べば出て来るみたいですけど、それだと、接続が切れてしまいますよね。  クライアントは一回発言をすると、接続を切ってしまうということでしょうか?  もし、リアルタイムなチャットのことをおっしゃっているのなら、なんだか変な感じがします。  リアルタイムなら、接続を切らず、一行で一発言にした方がいいのではないでしょうか?

noname#10667
質問者

お礼

回答ありがとうございます。 重大な考え違いがありました。 改行を含めた、発言単位で、いちいち終端 があるものと思っていました。 プログラムの組み方を変えてみます。

関連するQ&A

  • ファイル出力時の

    以下のソースでファイル出力するのですが、 BufferedReader br = new BufferedReader(new FileReader(new File(args[0]))); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(args[1]))); //一行読み込みを行った文字列を格納 String line; //一行読み込み while((line = br.readLine()) != null){ //一行書き込み pw.write(line); System.out.println(line); } コンソールへの出力は正常に出力されるのですが、 ファイルへの出力は改行されずに一行で出力されてしまいます。 どうすればファイル出力も正常になるか教えてください。

  • BufferedReader.readline()で読み込んだ文字列の

    BufferedReader.readline()で読み込んだ文字列の長さがおかしい。 質問させてください。 BufferedReader.readline()を使用して入力した文字列の長さを表示させると、値が正しく表示されません。 例えば、「東京都千代田区」と入力した場合、長さは9と表示されます。 (東京都と入力すると長さは3と表示されます) どなたか原因をご存知ありませんでしょうか。 コードを以下に記載します。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Question_1_1 { /* * メイン関数 * @param args 起動引数 */ static public void main(String[] args) throws IOException{ InputStreamReader input = new InputStreamReader(System.in); BufferedReader buff = new BufferedReader(input); String str = ""; System.out.println("文字列入力>"); str = buff.readLine(); System.out.println("文字列長さ : " + str.length()); // ストリームを閉じる input.close(); buff.close(); } }

    • ベストアンサー
    • Java
  • ワードで自動的に改行したい

    ワード2003を使用しています。一行に書ける最大文字数を超えると次の行に自動的に移りますが、この時に自動的に改行を入れることはできないでしょうか?改行がないと次の行の先頭にスペースを入れたい時に前の行の終わりにどんどんスペースが入り枠を超えてしまいます。よろしくお願いします。

  • 終端識別子 とは?

     以下PHP参考書の ヒアドキュメント の説明すが、その中に、「終端識別子」とあります。  「終端識別子」とは何のことなのでしょうか!?    もし、以下の説明の中に「終端識別子」があるのでしたら、何にあとるのですか!?   私は読解力にかけるので分かりません!?   宜しくお願いいたします。   P61 ヒアドキュメント    PHPでは複数行又がる長い文字列を手軽に利用する方法として、シングルクオートとダブル クオートのほかにヒアドキュメントという方法があります。ヒアドキュメントはヒアドキュメント 構文(<<<)のあとに終端識別子を定義し、その終端識別子が出現するまでを文字列とします。  終端識別子は必ず行頭から始まり、直前に空白(インデント)を含めず、すぐに改行する必要が あります。また、ヒアドキュメントの中では、ダブルクオートと同様に変数が展開されます。また、ダ ブルクオートはそのままダブルクオートになります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  <?php $age = 15; $foo = <<<EOI ヒアドキュメントでは、このように、 複数行にわたる文章をそのまま表記することができます。 Tom の年齢は "$age" 歳です。 EOI; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ もちろん、ダブルクオートで通常の文字列を定義するように、複数行にまたがる文字列を定義す ることもできます。しかし、文章の中にダブルクオートが含まれる長い文章などでは、いちいちダブル クオートにエスケープ(\")が必要となり、これで不便な場合があります。ヒアドキュメントは、た とえばHTMLのテンプレートを記述したり、コマンドラインのヘルプ文を作成するなどに役立ち ます。

    • ベストアンサー
    • PHP
  • Javaで2

    ジャヴァで例えば、 BufferReader br のbrに”My name is koizumi 456” という文字列が入っていたとします。ここで文末の456だけをとり出してあるString に代入したいです。何かいい知恵ないでしょうか? どんな任意の文字列の最後だけを取り出せるようなものを作りたいのですがどうしても思いつきません。 例えば String line; whilr(line = br.readLine())!=null){ System.out.println(line); } とすれば文字列の全てが表示されますよね。ここで最後を取り出すつまり次の文字列=nullと判定された文字列を出せばOKだとおもいます。そんなメソッドありますか?

  • VBAでテキストファイルの改行を無視する方法

    VBAでテキストファイルにある文字列を配列の変数に格納したいのですが、改行が含まれているとそこから2バイトずつずれてしまいます。 1行毎に読もうとしても1行の文字列が6000バイトぐらいあるので変数に格納しきれません。 読み込むテキストファイルは _________0_________1_________2・・・・________10 _______100________51 のようになっており、10バイトずつ変数に格納していきたいです(スペースも格納する必要あり) 以下のように作ったのですが、改行のあるところからずれてしまいます。 Sub ファイル読み込み() Dim buf(30000000) As String Dim i As Long i = 0 With CreateObject("Scripting.FileSystemObject") With .OpenTextFile("C:\test.text", 1) Do While .AtEndOfStream <> True buf(i) = .read(10) Loop End With End With End Sub 「次の文字列が改行コードである」ということが分かれば.skipで飛ばせるのですが、その判定式が探しても見つかりません。 どなたかご教授よろしくお願いします。

  • EXCELで改行しながら文字表示

    セルB1に  「12345678(改行)ABCDEFGH(改行)abcdefgh(改行)09876543」 と表示させたいです。(文字列は例) 半角8文字単位で改行 表示させる元データは、  セルB5=C5&D5&E5&F5     C5=12345678(文字列)     D5=ABCDEFGH(文字列)     E5=ABCDEFGH(文字列)     F5=09876543(文字列)   各々文字列が入力されないこともあります。  (文字が無ければ前詰めですが、できるだけ8文字単位にしたいので   半角スペースを入れたりします。) C5からF5を入力することにより、カーソルをB5にもっていくと 結果としてB1に表示させるというものです。 文字列は*5行のセルだけでなく、8000行くらいあります。 欲をいえば、カーソルがある行のセルB*を表示させることが できればベストです。 (例えば、F4000にカーソルがあれば、B4000の文字を表示する) 宜しくお願いします。

  • C言語でファイルからの文字列抽出について

    C言語でファイルからの文字列抽出について INPUTファイルからキーワードを探し、キーワードがあった行をOUTPUTファイルに出力したいのですが、どうしたら良いかわかりません。 //一行ずつ読み込む while(fgets(buf,sizeof(buf),fp)!=NULL){ //文字列からキーワードを探す //キーワードがある一行をOUTPUTファイルに出力 } こんな感じになると思うのですが、どういうコードを書いたら良いかわかりません。 分かる方いらっしゃいましたらご回答宜しくお願いします。

  • 配列を返す

    ファイルから読み込んだ一行の文字列を読み込みカンマごとに区切って 返すというプログラムを関数化することで効率を図りたいと思います。 int main() { char buf[1000]; char *str; char *bufG; //ファイルを読み込む  while(fgets(buf,1000,fp) != NULL){//一行ずつ読む str = buf;//先頭アドレスを指す     bufG = //文字列を返す関数  ・  ・  ・ } } //文字列を返す関数 {    for(i = 0; *str != ',' && *str != '\0'; i++){ if(*str == '\n'){ bufG[i] = '\0'; } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; return bufG; } 前の質問で自動変数でこの関数を抜けたら廃棄になるというのは わかったんですが(そういう警告がでました) ここからどのようにすれば求めるプログラムになりますか? 引数とかちょとわからないので関数定義を書きませんでした。 (1)ファイルをよみこむ (2)一行ずつ読み込み文字列をbufにいれる (3)ポインタstrをbufの先頭アドレスにする (4)get_word関数にてポインタをずらしていき カンマがあればそこまでの文字列を返す (5)main関数に戻り変数に代入する (6)終端文字があるまで(4)ー(5)を繰り返す。 (7)さらに行数分繰り返す これらの一連の流れをやりたいのですが わかりません。

  • 改行 横書き

    作文の改行ですが、横書きの作文で前の行が最後まで書いてあり、す。で終わりなのですがこの場合、す。の後は一行全部空いているのですが下の行に移って良いのですか? 回答、お願いします。