2014-02-09 98 views
3

我有一個快速讀取txt文件到ArrayList的問題。如果我想讀一個文件大小0,9MB,我必須等待5分鐘。如果文件大小爲34MB(偏愛,因爲android不接受大於1MB的文件),它完全不起作用。 我認爲這個過程應該是最短的幾秒鐘。如何更快地將文本文件讀取到ArrayList上android

這是一個代碼:

String word; 
public ArrayList<String> dictionary = new ArrayList<String>(); 

public void setup() 
{ 

    try { 
     AssetManager assetManager = getAssets(); 
     InputStream inputf; 
     inputf = assetManager.open("dict_1.txt"); 
     reader = new BufferedReader(new InputStreamReader(inputf)); 

     word = " ";  
     while(word != null) 
     { 
     word = reader.readLine(); 

     if (word != null) 
      dictionary.add(word); 
     } 
     if(reader.equals("null")) println("No file found"); 

    } catch (NullPointerException e) { 
    e.printStackTrace(); 
    println("No file found"); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
} 

我很抱歉,我的英語。我希望一切都不可思議。

+0

開始。 – CommonsWare

+0

'reader'不可能等於「null」,並且NullPointerException並不固有地表示'找不到文件'。我建議你修復你奇怪的錯誤和異常處理。 – EJP

+0

我修復了異常處理,但是如果文件完全被重新使用,雖然速度太慢,但這並不重要。 「 – TheDealer105

回答

2

當您添加項目時,您的ArrayList不斷重新分配。這可以消耗不少數量的CPU時間,尤其是在列表增長時,因爲需要在內存中複製一堆指針。更好的方法是將存儲條目的字典文件的第一個項目的數量,然後預分配ArrayList

dictionary = new ArrayList<String>(numberOfEntries); 

更高級的優化將是一個數據結構,它不依賴於一個Java集合類。根據您的需要,這可能是一個巨大的UTF-8字節數組,通過一次性讀入內存(甚至通過內存映射文件訪問)。

+0

」可能是一個巨大的UTF-8字節數組,可以一次性讀入內存(甚至可以通過內存映射文件訪問)「 - 我該如何使用它? – TheDealer105

1

你的問題是增加單詞的ArrayList In arraylist讀操作是不變的時間 - O(1),但write操作必須在backing arrayre-allocation運行的空間潛力,以及copy - 使運行在O(N )time.so你應該使用linkedlist代替arraylist。它通過使用Traceview,以確定您的時間被消耗在那裏提供效率o(1)(添加)

LinkedList<String> dictionary = new LinkedList<String>(); 
+0

+1但是,我假設OP將要對列表項進行某種隨機訪問。這些讀取操作將非常慢 - O(n)緩慢。 –

+0

不幸的是,兩種方法都給出了相同的結果。我更改爲預先分配ArrayList和LinkedList,並沒有發生任何變化。閱讀時間仍然很長。 – TheDealer105