鏈接: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"才會返回。