2012-06-15 54 views
4

我從以下網絡代碼獲得BufferedReader從BufferedReader獲得字符串的更好的方法

URL url = new URL(request); 
    HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection(); 
    InputStream inputStream = httpUrlConnection.getInputStream(); 
    bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
  1. 我想知道,哪種方式提供更高的效率,執行速度的期限?
  2. 1024尺寸是Android的不錯選擇?或者,有沒有我可以使用的任何系統常量值?

    int charRead = 0; 
        char[] buffer = new char[1024]; 
        StringBuffer stringBuffer = new StringBuffer(); 
        while ((charRead = bufferedReader.read(buffer)) > 0) { 
         stringBuffer.append(buffer, 0, charRead); 
        } 
    

 String line = ""; 
     StringBuffer stringBuffer = new StringBuffer(); 
     while ((line = bufferedReader.readLine()) != null) { 
      stringBuffer.append(line); 
     } 

回答

1

我認爲第一種方法更有效,但我寧願設置更高的緩衝區大小前。 8 * 1024。這是HttpClient中的默認CoreConnectionPNames.SOCKET_BUFFER_SIZE。 我寧願說8 * 1024以下的東西是不合理的,因爲大多數HTTP緩衝區都設置爲8 * 1024。

在第二種方法中,您假定流中有新的行字符。什麼20MB json的情況下優化,以便沒有新的行字符?這會打擊你的應用程序。

一條線被換行符('\ n'),一個回車符('\ r')或一個回車符緊跟在一個換行符之後被認爲是終止的。

在我看來,最好的選擇是使用8 * 1024的乘法。上限約束與存儲器的大小和連接速度相關的流緩存處理時間。

+0

使用8 * 1024的任何理由? –

0

可定較高的緩衝限制將是最好的選擇。

作爲每Java文檔

緩衝區的大小可以被指定,或者可以使用默認大小。默認值對於大多數目的而言足夠大。

緩衝是更好的方法。再次根據文檔

沒有緩衝,read()或readLine()的每次調用都可能導致從文件中讀取字節,轉換爲字符,然後返回,這可能非常低效。

+0

但問題是,如果我沒有特定的大小,我將如何構建一個char數組? –

+0

同意。更正了我的答案。 – kosa

1

使用StringBuilder被認爲是StringBuffer的更好選擇,除非您需要使用同步StringBuffer的開銷。 (StringBuilder是一個替代品)

至於性能,我會採取第一種方法,並避免使用readLine(),除非你需要處理該行作爲一行文本。此外,readLine()不會返回實際的換行符,因此您在第2個示例中創建的數據將缺少換行符,因此可能與從服務器傳輸的數據不完全相同。

+0

感謝您的StringBuilder技巧。我幾乎忘記了。 –