黑马程序员技术交流社区

标题: 关于BufferedReader的readLine的疑惑 [打印本页]

作者: 陈国柱    时间: 2013-10-2 22:41
标题: 关于BufferedReader的readLine的疑惑
假设读取的源文本如下:
testing1
testing2

testing3
testing4
===================
既然使用readLine方法,是不返回任何终止符的,那么使用while(line=bufr.readLine())!=null)循环体的时候,读取到第三行(testing2 和testing3之间,只按了一个回车键)的时候,返回给line的不就应该是null么?难道是读取完第三行之后返回了一个'\r'给line了?


作者: 酱爆    时间: 2013-10-2 23:29
应该是\r\n吧
作者: xiaoxu    时间: 2013-10-2 23:42
那个返回的是"";空元素,但不是null,写个程序测试下就可以了
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;

  3. public class Demo1 {

  4.         public static void main(String[] args) throws Exception {
  5.                 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  6.                 String str=null;
  7.                 while((str=br.readLine())!=null){
  8.                         if("".equals(str)){
  9.                                 System.out.println("hello!");
  10.                         }
  11.                 }
  12.         }
  13. }
复制代码
输入回车,会打印hello
作者: Simple_love    时间: 2013-10-2 23:45
读到第三行是时,第三行时末尾处有个换行符即是\r\n,当读取到换行符之后,返回的值不是null,而是一个换行符,
作者: 陈钦涛    时间: 2013-10-2 23:46
使用while(line=bufr.readLine())!=null)循环体的时候,读取到第三行(testing2 和testing3之间,只按了一个回车键)的时候,返回给line的不是null,readLine底层调用的是read方法,read方法将读到的字符存在数组里,read方法读到回车符后会把这一行不带回车符地返回。当读到你上面所说的第三行的时候,返回的是一个数组里面的空值为null,而不是这个数组对象是null。
作者: 陈钦涛    时间: 2013-10-3 00:18
再补充一点。readLine读取数据到流中后你再把这个流中数据写入到另外一个文本文件的时候,那个文本文件是不会出现你例子里面的回车的,你得把newLine加入流中才能再文本上出现换行。
作者: 路边小色狼    时间: 2013-10-3 00:18
readLine()方法并不是读到的字符串什么都没有就返回null,而是到达流末尾才返回null。那什么时候叫做流末尾呢,就是没有读到字符,且没有终止符时才叫流末尾
而读到第三行时,虽然有个回车,但是readLine()方法是不能返回任何终止符的,所以并没有返回'\r'或'\n'。因为readLine()并没有换行功能,读到的信息会挤在一行。
你做个实验:
String s ="";
String s1=null;
System.out.println(s.equals(s1));
这个答案是false,说明什么?    说明没读到东西不等于是null

作者: hanfei2511    时间: 2013-10-3 06:22
同意陈钦涛的解释,顺便只要查一下api就明白了,我给你贴过来:
public String readLine() throws IOException
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.
Returns:
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
作者: 蔚蓝天色    时间: 2013-10-3 09:53
在windows操作平台上回车的字符表示为\r\n
ios上则是\n
Linux上则是\r




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2