2012-06-05 43 views
1

我的Android應用程序中有一個很大的txt文件(1.5 Mb)作爲私人資源。
該文件的結構是這樣的:Android - 更高效的方法來讀取大文本文件

"A1|A2|A3|A4#B1|B2|B3|B4#C1|C2|C3|C4#..." 


其中A1,A2,A3,B1 ......是字母數字字符串。我需要創建一個對象的每個組串​​的,是這樣的:

MyObject objA = new MyObject("A1", "A2", "A3", "A4"); 
MyObject objB = new MyObject("B1", "B2", "B3", "B4"); 
... 


我才能讀取這個文件制定了閱讀器類...但它看起來有點慢。
這就是:

public class TextFileReader { 

    private static Charset charset = Charset.defaultCharset(); 
    private InputStream stream; 
    private InputStreamReader reader; 
    private StringBuffer buffer; 

    public TextFileReader(Context c, String s) { 
     try { 
      this.stream = c.openFileInput(s); 
      this.reader = new InputStreamReader(this.stream, charset); 
      this.buffer = new StringBuffer(); 
     } catch (FileNotFoundException e) { 
     } 
    } 

    public String readNextSubstring(char div) throws IOException { 
     buffer.delete(0, buffer.length()); 
     int i; 
     char c; 
     while ((i = reader.read()) > -1) { 
      c = (char) i; 
      if (c == div) break; 
      buffer.append(c); 
     } 
     return buffer.toString(); 
    } 
} 


我用TextFileReader這樣:

TextFileReader reader = new TextFileReader(context, "big_file.txt"); 

//First group 
String group = reader.readNextSubstring('#'); 
String[] info = group.split("\\|"); 
MyObject objA = new MyObject(info[0], info[1], info[2], info[3]); 

//Second group 
group = reader.readNextSubstring('#'); 
info = group.split("\\|"); 
MyObject objB = new MyObject(info[0], info[1], info[2], info[3]); 

//Obviously this is done in a while loop :) 
... 


你覺得這個怎麼樣的方法?它能以更有效的方式進行組織嗎?
我不關心的空間,我在乎時間(模擬器花費大量的時間,以讀取文件)

+3

爲什麼你不重構你的文件使用json?已經制作完成,速度非常快。無論如何,一個很好的方法是使用BuffedReader。嘗試閱讀此信息是所有.http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/ – PedroAGSantos

+0

我的第一反應是,你爲什麼這樣做?把數據放在一個sqlite數據庫。 – jasonhudgins

+0

我無法使用sqlite數據庫,因爲數據位於遠程服務器中。和Android的訪問遠程數據庫的支持真的很糟糕...... – Oneiros

回答

2

我能找到一個簡單的調整,可以通過提高多少時間,加快您只需你花這樣做:group.split("\\|");

java的方式是這樣的,每次你運行這條線,它會編譯一個新的regex

如果你這樣做:

Pattern pattern = Pattern.compile("\\|"); 
TextFileReader reader = new TextFileReader(context, "big_file.txt"); 

while (reader.hasMoreData) 
{ 
    String group = reader.readNextSubstring('#'); 
    String[] info = pattern.split(group); 
    MyObject objA = new MyObject(info[0], info[1], info[2], info[3]); 
    ... 
} 

這將減少用來編譯模式的時間 - 這可以爲你的數據量相當可觀。

另外,1.5MB沒有那麼多,也許使用BufferedReader將所有內容加載到內存中可能會進一步提高性能。

相關問題