2010-11-26 52 views
4

所以我在我的Java(應該是非常簡單的)應用程序上運行一個分析器,並且感到驚訝的是僅次於需要根據時間發出HTTP請求的方法是我的inputStreamToString方法。目前定義如下:有效的輸入流到java中的字符串方法

public static String inputStreamToString(InputStream in) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line).append("\n"); 
    } 
    in.close(); 
    return sb.toString(); 
} 

我該如何讓這個更快? (是的,我確實需要字符串,並且不,InputStrings不是那麼大,並且不,這種方法比程序中的大多數方法被調用的次數要少,不,我沒有辦法避免這種需要)

+1

嗯,這就是所有的I/O發生(我假設探查器包括所有的時間的readLine()需要等待數據進來)。你能做的唯一明顯的事情就是用一個足夠大的緩衝區預先初始化StringBuilder,這樣它就不必重新分配內存,但我認爲讀取數據所花費的時間會讓所有事情都變得很矮小。 – EboMike 2010-11-26 21:15:38

回答

5

那麼,這就是所有I/O發生的地方(我假設分析器包含readLine()用來等待數據進入的所有時間)。你能做的唯一明顯的事情就是用一個足夠大的緩衝區預先初始化StringBuilder,這樣它就不必重新分配內存,但我認爲讀取數據所花費的時間會讓所有事情都變得很矮小。

除此之外 - 你是I/O綁定。通過網絡接收數據只需要時間。

編輯:也可能包括卡薩布蘭卡的評論:而不是一行一行閱讀,然後添加一個換行符,你可能會使用一個簡單的閱讀器與你提供的合理的大緩衝區,只是塊讀取一切。無需逐行讀取,因爲您似乎只是複製整個輸入數據。如果您想將新行標準化(如\r\n)爲標準\n,則逐行手動執行的唯一原因是。

0

嘗試從雅加達公共區使用IOUtils.copy()。 創建ByteArrayOutputStream,將HTTPRequest流中的字節複製到此ByteArray,然後使用新的String(字節,「UTF-8」)創建字符串。

我相信它可以更快...

但你的代碼看起來它是書面說明良好的作風和良好的編碼都沒有。我真的不明白這裏可能如此無效。可能需要時間,因爲你的其他邏輯相對簡單,寫得很好?我的意思是,儘管這段代碼需要相對多的時間,但這不是太重要嗎?

相關問題