关于使用Socket的flush过去无法readLine得到的问题

原因是这样的:

大佬解释的传送门:https://blog.csdn.net/swingline/article/details/5357581

之前的结论是我推论出来的,误人子弟了。谢谢专研者,tmd源代码看不太懂啊。

flush方法只是将字符刷新过去。

readLine方法读取一行数据,注意:一行数据是以\r\n作为终止条件的。

flush过去的数据一般是没有换行符的,所以就无法读取。

readLine本质上调用的是这个方法:

  

 

  

为什么有时候我们flush过去的却能够得到呢?

  我们注意flush之后是否有类似的代码:

  

 

 这些都是关闭流操作的代码。

我们一般会在finally中写上关闭流的代码,也就最终执行了流的关闭。

 

你可以尝试在flush之前使用BufferedWriter的newLine();方法,这样你会发现flush刷新过去的在服务器端是可以读取到的,不一定需要shutdownInputStream或者shutDownOutputStream。

或者你再发送信息之前在原来编写的信息后加上换行或者回车符即可。

 

newLine

public void newLine()
             throws IOException
写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符。

 

抛出:
IOException - 如果发生 I/O 错误

close

public abstract void close()
                    throws IOException
关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。

 

指定者:
接口 Closeable 中的 close
抛出:
IOException - 如果发生 I/O 错误

flush

public void flush()
           throws IOException
刷新该流的缓冲。

 

指定者:
接口 Flushable 中的 flush
指定者:
类 Writer 中的 flush
抛出:
IOException - 如果发生 I/O 错误

readLine

public String readLine()
                throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 
返回:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
posted @ 2016-07-31 17:41  guodaxia  阅读(1278)  评论(1)    收藏  举报