IO流知识盲点
- BufferedReader的readLine()方法读取不到换行和回车时会阻塞
BufferedReader的readLine()方法读取不到换行和回车时会阻塞
readLine()在没有读取到换行符或回车符时。是不会返回的。而是处于阻塞状态。所以这个while在读取一条消息后。一直在readLine()上阻塞。当客户端发来下一条消息时。会继续下一次循环,等待读取下一条消息
1.原来readLine()方法在进行读取一行时,只有遇到回车(\r)或者换行符(\n)才会返回读取结果,这就是“读取一行的意思”,重要的是readLine()返回的读取内容中并不包含换行符或者回车符;
2.由于在客户端使用的readLine()来读取用户输入,所以当用户按下回车键是,readLine() 返回读取内容,但此时返回的内容并不包含换行符(查看readLine()源码,会将\r,\n或者\r\n去除掉),而当在服务器端用readLine()再次读取时,由于读取的内容没有换行符,所以readLine()方法会一直阻塞等待换行符,这就是服务器端没有输出的原因。
解决方法:
在客户端每次输入回车后,手动给输入内容加入"\n"或"\r",再写入服务器;
注意:
1、误以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null。没有数据时会阻塞,在数据流异常或断开时才会返回null
2、readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。
如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。
3、使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞
使用readLine()方法遇到的坑