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是不是阻塞的?的主要内容,如果未能解决你的问题,请参考以下文章

I want to do——输入流readline阻塞问题

readLine读取socket流的时候产生了阻塞

等待 IO 的线程是不是也会阻塞核心?

java Future 阻塞

死磕NIO— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

死磕NIO— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?