2015-07-19 123 views
0

我正嘗試使用HttpsURLConnection從服務器讀取響應。優化BufferedReader readLine()操作

InputStreamReader in = new InputStreamReader((InputStream) con.getContent()); 
    BufferedReader buff = new BufferedReader(in); 

    String line; 
    StringBuilder response=new StringBuilder(); 
    long st=System.nanoTime(); 

    while ((line =buff.readLine())!= null) { 
     response=response.append(line +"\n"); 

    } 

    long et=System.nanoTime(); 
    System.out.println("resp process time: "+((et-st))+" ns"); 
    return response.toString(); 
} 

目前,大約需要450毫秒來讀取整個約80000個字符(1100行)的響應。

輸出:RESP處理時間:435272240納秒

是否可以進一步優化該代碼,以減少處理時間?

+0

的可能重複【JAVA:如何看的BufferedReader更快(http://stackoverflow.com/questions/4666748/java-how-to-read-bufferedreader-faster) – 2015-07-19 12:20:14

+0

@OSryx不完全重複,因爲這裏使用了一個'StringBuilder'。 – RealSkeptic

回答

1

您創建了一個不必要的臨時字符串line + "\n"。你可以避免這一點。

while ((line = buff.readLine()) != null) { 
    response.append(line).append('\n'); 
} 

您還可以避免BufferedReader(無需掃描輸入以查找換行符)。

InputStreamReader in = ... 
char buffer[] = new char[8192]; 
int count; 
while ((count = in.read(buffer)) != -1) 
    response.append(buffer, 0, count); 
+0

對於使用char []而不是'BufferedReader'的部分+1。如果您沒有對每一行進行任何處理,我個人更喜歡這個選項。如果輸入大小太大,可能會導致問題:P – TheLostMind

+0

來自服務器的響應大小不固定,並且可能與每個請求大不相同,所以此解決方案是正確的,但不適用於此特定場景 – Akki

+0

@Akki:BufferedReader也具有默認值8192個字符的緩衝區,因此兩種解決方案的內存特徵都相同。當然,如果響應發送內容長度標題和編碼,則可以估計響應緩衝區的大小以及用於複製的任何臨時緩衝區。 – wero