1. 程式人生 > >java Socket通訊使用BufferedReader和BufferedWriter的注意事項

java Socket通訊使用BufferedReader和BufferedWriter的注意事項


注意事項:readLine()要求有換行標識,write()要輸出換行標識,要呼叫flush()重新整理緩衝區。
下面是取自java socket通訊中的一小段程式碼。

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String input = null;
while(!"bye".equalsIgnoreCase(input=reader.readLine())){
    System.out.println("客戶端傳來資料:"+input);
    writer.write("我接收到你的資料:"+input);
    writer.newLine();
    writer.flush();
}


上面的java Socket通訊用到了BufferedReader的readLine()方法和BufferedWriter的write()方法。
注意readLine()方法,通過檢視JDK中關於此方法的註釋可知,它是讀取一行資料,這行資料的末尾必須有換行符識別符號說明到此為止是一行。不然readLine()方法無法順利讀取,同理對應於PrintWriter的println方法,不可用print方法,否則也會導致readLine()方法無法讀取資料。
所以在伺服器端或客戶端進行輸出的時候必須輸出換行標識(\n),讓對方可以順利讀取一行。因此可以這樣寫writer.write("hello world\n")。為了更好地使用java的跨平臺特性,BufferedWriter提供了一個newLine()方法,該方法就是專門輸出一個換行符。所以也可以這樣寫writer.write("hello world");writer.newLine();
另外既然是BufferedWriter,自然用到了緩衝,當你輸出的字元長度不超過緩衝區時,可能不會被輸出,這時候程式也無法正常執行。所以要用writer.flush();重新整理緩衝區。也就是說writer.write("我接收到你的資料:"+input);writer.newLine();writer.flush();必須一起使用,它們總是同時出現,因此你可以自定義一個方法,包含這三個方法。

public void writeLine(String msg){
    writer.write(msg);

    writer.newLine();

    writer.flush();
}