我有快速读取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();
}
}
对不起我的英语。我希望一切都是不可理解的。
答案 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)