如何在android上更快地将文本文件读取到ArrayList

时间:2014-02-09 22:10:54

标签: java android text file-io arraylist

我有快速读取txt文件到ArrayList的问题。如果我想读取文件大小为0.,9MB,我必须等待5分钟。如果文件大小为34MB(部分原因,因为android不接受大于1MB的文件),它完全不起作用。 我认为这个过程应该最多只有几秒钟。

这是一段代码:

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();
    }
}

对不起我的英语。我希望一切都是不可理解的。

2 个答案:

答案 0 :(得分:2)

当您添加项目时,ArrayList会不断重新分配。这可能会占用大量的CPU时间,特别是当列表增长时,因为需要在内存中复制一堆指针。更好的方法是将条目数存储为字典文件的第一项,然后预先分配ArrayList

 dictionary = new ArrayList<String>(numberOfEntries);

更高级的优化将是一种完全不依赖于Java集合类的数据结构。根据您的需要,这可能是一个巨大的UTF-8字节数组,可以一次性读入内存(甚至可以通过内存映射文件访问)。

答案 1 :(得分:1)

您的问题是向arraylist添加单词In arraylist读取操作是固定时间 - O(1)但write操作可能会耗尽backing array中的空格,{{ 1}}和re-allocation - 以便在O(n)时间内运行。因此,您应该使用copy代替linkedlist。它提供效率arraylist(用于添加)

o(1)