18. IO会阻塞吗?readLine是不是阻塞的?
Posted grimmjxcl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18. IO会阻塞吗?readLine是不是阻塞的?相关的知识,希望对你有一定的参考价值。
IO阻塞问题,请参考一下博文:
https://blog.csdn.net/yyxyong/article/details/62894064
resdLine
一、网络模式:
1、在网络上,readLine()是阻塞模式,也就是说如果readLine()读取不到数据的话,会一直阻塞,而不是返回null,所以如果你想要在while循环后执形相关操作是不可能的,因为while()里面是一个死循环,一旦读不到数据,它又开始阻塞,因此永远也无法执形while()循环外面的操作,所以应该把操作放在while循环里面。(在我做的即时通讯里,为了能够不断获取服务器返回的消息,就是用这种方法,不断去服务器获取消息,一旦有就返回。)
2、在while()里面判断readLine()!= null的时候要赋值给一个String,因为如果不为null,那么这时候已经读了一行。如果用while (br.readLine()!=null),那么下面没法再获取到这一行,所以应该用
while ((line = br.readLine())!=null){}
3、readLine()通过下列字符之一即可认为某行已终止:换行 (‘ ‘)、回车 (‘ ‘) 或回车后直接跟着换行,所以我们在发送数据的时候要再后面加上这些标志符,否则程序会阻塞。而我是直接用下面这种方法:
PrintStream ps = new PrintStream(socket.getOutputStream(), true, "UTF-8");
ps.println()。
ps.println()已经包含换行了,所以不要用print(),若是要就要在后面加上换行符;
4、readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。
二、读取文件模式:
1、readLine()什么时候才会返回null呢?读取到文件等的结尾时候。(注意和网络上的是不一样的)。
- 如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。
以上是关于18. IO会阻塞吗?readLine是不是阻塞的?的主要内容,如果未能解决你的问题,请参考以下文章