關於BufferedReader的讀取效率問題
BufferedReader的讀取效率
1. 一般情況
正常采用readline讀取,一行行讀取。
readline要註意阻塞的情況,當一行沒有”/r”、”/n”、”/r/n”就會阻塞在那。
InputStreamReader isr = new InputStreamReader(connection.getInputStream(), "UTF-8"); in = new BufferedReader(isr); String line; while ((line = in.readLine()) != null) { result += line; }
2. 采用read+CharBuffer
inputStream = connection.getInputStream(); isr = new InputStreamReader(inputStream, "UTF-8"); in = new BufferedReader(isr); CharBuffer bos = CharBuffer.allocate(20480); StringBuilder builder = new StringBuilder(); while (in.read(bos) != -1) { bos.flip(); builder.append(bos.toString()); }
註:bos.flip()作用是將指針指向緩沖區的開頭
經過一千條數據的讀取,發現采用read+CharBuffer的效率要比readline來的高效的多!!!!
補充:
後續實驗中發現,其實並不是read方法和CharBuffer高效。其實是String對象頻繁的創建導致效率低下,使用CharBuffer和StringBuilder解決瞭這一問題。
OJ系統裡用BufferedReader提高效率
在OJ系統中做編程題時,如果從System.in讀入的數據非常大的時候,使用Scanner非常影響效率,可能導致最終代碼超時,所以最好改用BufferedReader來讀取字符數據。
例如:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[]args) { BufferedReader buf=null; buf=new BufferedReader(new InputStreamReader(System.in)); String str=null; try { int a= Integer.parseInt(buf.readLine()); double b=Double.parseDouble(buf.readLine()); } catch (IOException e) { e.printStackTrace(); } System.out.println(); } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Java Process與Runtime()的使用及調用cmd命令阻塞的解決方案
- 使用ServletInputStream在攔截器或過濾器中應用後重寫
- 解決BufferedReader.readLine()遇見的坑
- 關於BufferedReader的read()和readLine()的區別
- 解決Process.getInputStream()阻塞的問題