Символ новой строки опускается при чтении из буфера
Я написал следующий код:
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(). От Java Docs:
читать строку текста. Линия считается прекращенным любым лицом линейной подачи ('\n'), каретки возврат ('\r') или возврат каретки сразу же за ним последовал linefeed.
Итак, что происходит, ваш "\n " рассматривается как линейный канал, поэтому читатель считает, что это строка.