IO流知识盲点

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流知识盲点相关的知识,希望对你有一定的参考价值。


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()方法遇到的坑


以上是关于IO流知识盲点的主要内容,如果未能解决你的问题,请参考以下文章

知识盲点汇总

知识盲点汇总

MyBaitsPlus----知识盲点整理

java开发知识IO知识之输入输出流以及文件

IO流相关知识(File,字节流,字符流,特殊操作流(标准输入流,标准输出流,对象序列化与反序列化,properties与IO流结合))相关知识总结

Javascript基础知识盲点总结——对象