最近跟一個小伙伴在群里聊天,他說用 readLine 讀取網絡設備的數據為什么會這么慢?
說實話,平時我們用 BufferedReader 、BufferedWriter 比較多,但是一般是讀取文件較多。
代碼:
Socket socket = new Socket();
socket.bind(new InetSocketAddress("hostname", port));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = "";
while(true){
line = br.readLine();
if(line == null){
break;
}
System.out.println(line);
}
問題是上面的輸出很慢,看了上面的代碼,有不少的問題,不只是輸出慢,程序很有可能卡死在這里。如果優化,應該這樣寫:
while(null != (line = br.readLine())){
// todo
}
readLine 有幾點需要注意:
1.readLine 方法如果獲取不到數據,會一直阻塞,而不是返回 null,除非發生異常或者發送方 close
2.如果數據沒有行換符('\n')、回車('\r')、或者('\r\n'),那么 readLine 不會返回,直到緩存滿或者文件結尾為止,緩存是 8192 個字符
3.BufferedReader 不適用網絡傳輸
最后,上面慢的原因是,數據沒有換行符,回車符,一直到 8192 字符緩存滿才返回,所以慢。
