1,從標准輸入上建立輸入流:
BufferedReader localReader = new BufferedReader( new InputStreamReader(System.in));
System.in 表示標准輸入,一般指鍵盤。
建立輸入流,從標准輸入讀取數據到緩沖區中。
當在標准輸入中輸入一行字符串時,按回車之后,這行數據就會被讀取到緩沖區中。
比如: abc \r\n(表示按下回車鍵)
那么msg就會賦值為 abc
String msg = null; while ((msg = localReader.readLine()) != null) { System.out.println(msg);//打印從標准輸入讀取到的數據 process(msg); if (msg.equals("bye"))//當輸入 bye 時 結束 break; }
BufferedReader 使用 readLine方法讀取數據時,每次讀取一行。以回車換行標記一行數據的結束。
使用if語句來判斷用戶是否在標准輸入中輸入了bye。若輸入了bye之后,就跳出while循環。若沒有if語句,while循環就不會終止。
2,從Java的 InputStream中建立輸入流
從InputStream中輸入與從鍵盤輸入是有區別的,InputStream流可以關閉(異常關閉或正常關閉),而對於鍵盤而言,沒有關閉的概念,只要你從鍵盤敲入字符並按回車就會輸入一行字符。
下面是從Socket的輸入流中建立起BufferedReader的輸入:
BufferedReader localReader = new BufferedReader( new InputStreamReader(socket.getInputStream()));
在此種情況下,當使用while( (str = localReader.readLine()) != null )讀取數據時,何時才能讀取完畢跳出while循環呢?
一種方法是與 1 中討論的一樣,使用一個標記字符串,如"bye",具體解釋看上面。
另一種方法是:因為本例是從Socket的InputStream中讀入數據的,因此當Socket的發送端發完數據后並關閉了Socket,那么接收端就會讀入發送端的數據。當接收端再讀數據時,readLine()就會返回null。此時會跳出while。(若發送端沒有關閉Socket,接收端再讀數據時,就會阻塞等待發送端再發送數據過來。若發送端關閉了Socket,接收端再讀數據時,就會返回null)
綜上所述,當在while循環中使用BufferedReader的readLine方法時,while循環退出的條件是:
a)在while循環中使用 if 判斷 結束的標記字符串(如 "bye"),使用break 跳出while,
b)若是建立的Socket連接、或者其他InputStream流的輸入。當發送方關閉了流時,readLine方法再次讀取時會讀到 null 值。這樣也就跳出了while。
注意如果是寫數據時,記得flush一下。