Символ новой строки опускается при чтении из буфера

Я написал следующий код:

public class WriteToCharBuffer {

 public static void main(String[] args) {
  String text = "This is the data to write in buffer!nThis is the second linenThis 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) пропущены? Если я раскомментирую

6 ответов


JavaDoc говорит

public String readLine()
                throws IOException

читает строку текста. Строка считается завершенной любым из каналов строки ('\n'), возврата каретки ('\r') или возврата каретки, за которым немедленно следует поток строки.
возвращает:
Строка, содержащая содержимое строки, не включая символы завершения строки, или null, если достигнут конец потока
Броски:


С Javadoc

читать строку текста. Строка считается завершенной любым из каналов('\n'), возврат каретки ('\r') или возврат каретки, за которым немедленно следует подача строки.

вы можете сделать что-то подобное

buffer.append(line);
buffer.append(System.getProperty("line.separator"));

на всякий случай, если кто-то хочет прочитать текст с '\n' включено.

попробуй такое простой подход

и

скажи, у тебя есть три строки данных (скажем, в .txt file), вот так

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

и во время чтения, вы делаете что-то вроде этого

    String content=null;
    String str=null;
    while((str=bufferedReader.readLine())!=null){ //assuming you have 
    content.append(str);                     //your bufferedReader declared.
    }
    bufferedReader.close();
    System.out.println(content);

и ожидая выхода на

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

вот что вы можете сделать

добавив этот кусок кода внутри цикла while

if(str.trim().length()==0){
   content.append("\n");
}

так что ваш while цикл должен выглядеть как

while((str=bufferedReader.readLine())!=null){
    if(str.trim().length()==0){
       content.append("\n");
    }
    content.append(str);
}

теперь вы получаете необходимый вывод (в виде трех строк текста)

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

это то, что javadocs говорит для метода readLine() класса BufferedReader

 /**
 * 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
 */

readline() не возвращает конец строки платформ. JavaDoc.


Это из-за readLine(). От Java Docs:

читать строку текста. Линия считается прекращенным любым лицом линейной подачи ('\n'), каретки возврат ('\r') или возврат каретки сразу же за ним последовал linefeed.

Итак, что происходит, ваш "\n " рассматривается как линейный канал, поэтому читатель считает, что это строка.