readLine()的注意點


鏈接:https:////www.cnblogs.com/tangZH/p/7837992.html

更多精彩鏈接:http://77blogs.com/?p=142

我在用socket做即時通訊的時候,讀取服務器返回的信息用了BufferedReader,用起來挺方便的。

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line ;
while ((line = br.readLine())!=null){
}
readLine()用起來很方便,每次都是返回一行。
不過該方法有許多值得注意的地方:

一、網絡模式:
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()通過下列字符之一即可認為某行已終止:換行 ('\n')、回車 ('\r') 或回車后直接跟着換行,所以我們在發送數據的時候要再后面加上這些標志符,否則程序會阻塞。而我是直接用下面這種方法:
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"才會返回。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM