2011-09-15 16 views
4

我有下面的代碼片段閱讀文本文件的全部內容爲一個字符串。它的工作原理,唯一的問題是......它真的很慢(文件大約1500行)。Java的Android的閱讀完整的文件迅速

  InputStream is = this.getResources().openRawResource(R.raw.comp_rules_glossary); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      String previousLine = "start"; 

      while ((readLine = br.readLine()) != null) 
      { 
       rules = rules + readLine + eol; 
       if (previousLine.equals("")) 
       { 
        content = content + readLine + eol; 
       } 
       previousLine = readLine; 
      } 

      is.close(); 
      br.close(); 

目前,我正在讀一列完整的文件的時間,然後將其附加到字符串。有沒有更快的方法來做到這一點?我正在尋找一種將整個文件轉換爲字符串的快速方法。

+1

看到這個http://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file –

+0

偉大的工作,謝謝! – numegil

+0

只是開玩笑,而不是看我的解決方案。 – numegil

回答

3

使用StringBuilder建設大型字符串。

StringBuilder sb_rules = new StringBuilder(); 
StringBuilder sb_content = new StringBuilder(); 
while ((readLine = br.readLine()) != null) 
{ 
    sb_rules.append(readLine); 
    sb_rules.append(eol); 
    if (previousLine.equals("")) 
    { 
     sb_content.append(readLine); 
     sb_content.append(eol); 
    } 
    previousLine = readLine; 
} 
content = sb_rules.toString(); 
content = sb_content.toString(); 

Why StringBuilder when there is String?

字符串不允許追加。您在String上調用的每個方法都將創建一個新對象並將其返回。這是因爲字符串是不可變的 - 它不能改變它的內部狀態。

1

我看到你似乎已經擁有基於凱文的評論工作的解決方案,但爲什麼你的舊代碼是緩慢的,可能有助於理解。

問題是,當你直接連接字符串與+運算符或concat()方法時,它實際上是創建一個新的字符串與結果的結果。這涉及到複製你連接的兩個字符串的全部內容。所以,當你在文件中讀取,並建立內容的字符串,每次添加到它,你創建你有內容,到目前爲止一切的另一個副本。

的解決方案,我以爲是你現在在做什麼,是使用StringBuffer類,它是一個動態的緩衝區,允許你修改其內容(即追加新的數據到年底),沒有總是不得不分配一個新的String對象並將其全部複製到它。

,你必須記住的最主要的是字符串在Java中是不可變的。任何時候你在一個java字符串上調用一個以某種方式改變它的方法時,它實際上是創建一個字符串的新副本,並且修改的結果。

1

假設Apache的百科全書適用於Android精品,你可以使用這樣的事情?

InputStream is = this.getResources().openRawResource(R.raw.comp_rules_glossary); 
String text = IOUtils.toString(is, "UTF-8"); 

(或者你可以使用番石榴和其CharStreams幫手,但它通常更詳細)

要不是有你想避免第三方庫的一個原因?

+1

在這種情況下,最好只寫10行代碼而不是包含庫。代碼很簡單,然後你可以避免從lib jar添加額外的大小到apk,儘可能小的移動用戶。 – user605331