11

私は次のコードを書きました:

public class WriteToCharBuffer {

 public static void main(String[] args) {
  String text = "This is the data to write in buffer!\nThis is the second line\nThis is the third line";
  OutputStream buffer = writeToCharBuffer(text);
  readFromCharBuffer(buffer);
 }

 public static OutputStream writeToCharBuffer(String dataToWrite){
  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(byteArrayOutputStream));
  try {
   bufferedWriter.write(dataToWrite);
   bufferedWriter.flush();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return byteArrayOutputStream;
 }

 public static void readFromCharBuffer(OutputStream buffer){
  ByteArrayOutputStream byteArrayOutputStream = (ByteArrayOutputStream) buffer;
  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())));
  String line = null;
  StringBuffer sb = new StringBuffer();
  try {
   while ((line = bufferedReader.readLine()) != null) {
    //System.out.println(line);
    sb.append(line);
   }
   System.out.println(sb);
  } catch (IOException e) {
   e.printStackTrace();
  }

 }
}

上記のコードを実行すると、次のような出力が得られます。

This is the data to write in buffer!This is the second lineThis is the third line

改行文字 (\n) がスキップされるのはなぜですか? 次のようにSystem.out.println()のコメントを外すと:

while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
        sb.append(line);
       }

次のように正しい出力が得られます。

This is the data to write in buffer!
This is the second line
This is the third line
This is the data to write in buffer!This is the second lineThis is the third line

この理由は何ですか?

4

6 に答える 6

22

JavaDocは言う

public String readLine()
                throws IOException

1 行のテキストを読み取ります。行は、ライン フィード ('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。
戻り値:
行終了文字を含まない、行の内容を含む文字列、またはストリームの末尾に到達した場合は
null

于 2011-01-28T05:53:24.927 に答える
8

Javadocから

テキストを 1 行読みます。行は、ライン フィード('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。

あなたはそのようなことをすることができます

buffer.append(line);
buffer.append(System.getProperty("line.separator"));
于 2011-01-28T05:52:59.490 に答える
1

これは、クラス BufferedReader の readLine() メソッドについて javadocs が言うことです

 /**
 * Reads a line of text.  A line is considered to be terminated by any one
 * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
 * followed immediately by a linefeed.
 *
 * @return     A String containing the contents of the line, not including
 *             any line-termination characters, or null if the end of the
 *             stream has been reached
 *
 * @exception  IOException  If an I/O error occurs
 */
于 2011-01-28T06:09:55.673 に答える
0

readline()プラットフォームの行末を返しません。ジャバドク

于 2011-01-28T05:53:36.230 に答える
0

これは readLine() によるものです。Java ドキュメントから:

テキストを 1 行読みます。行は、ライン フィード ('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。

したがって、「\n」は改行と見なされているため、読者はそれを行と見なしています。

于 2011-01-28T05:54:50.957 に答える