關於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。

推薦閱讀: