确定文本文件长度的最有效方法是什么?

时间:2012-04-02 04:32:13

标签: java performance arraylist java.util.scanner bufferedreader

我有一个由数据行组成的数据文件,换行符分隔。我需要将文件的内容读入一个字符串数组,我想以正确的大小有效地创建数组。

最有效率
  1. 使用ArrayList,
  2. 使用BufferedReader扫描文件,标记开始,计数行然后重新设置回标记, 或
  3. ???

7 个答案:

答案 0 :(得分:5)

使用ArrayList(您的选项#1)。使用BufferedReader的{​​{1}}方法逐行读入文本文件。它简单,高效且易于维护。

答案 1 :(得分:2)

这取决于文件的大小以及您需要的效率:

  1. ArrayList是一个简单而有效的选项。只需创建一个新实例,然后逐个从BufferedReader添加字符串。然后在此列表中调用toArray()。

  2. 将整个文件作为字符串读取并手动拆分(我相信更高效)或者将java.lang.String提供的regexp拆分为字符串数组。如果您手动执行此操作,则可以计算“\ r \ n”符号的数量并创建具有确切大小的数组(即,您将保存数组列表重新分配)。

答案 2 :(得分:2)

您可以使用ArrayList并使用以下方法来优化它的大小:

  • trimToSize:将此ArrayList实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储。
  • ensureCapacity:如有必要,增加此ArrayList实例的容量,以确保它至少可以容纳由minimum capacity参数指定的元素数。

此外,如果您知道每行的平均大小,您可以尝试确定基于文件长度的数组大小(file_size / line_avg_size)。

答案 3 :(得分:2)

ArrayList比你的第二个更好。

当有经过验证的解决方案时,我不想用我自己的代码重新发明轮子。

答案 4 :(得分:1)

最好的办法是用一个操作读入整个文件。这是因为磁盘IO通常相对较慢,并且可能是应用程序中最慢的部分。将整个文件读入一个大字符串,然后在新行标记('\ n')上split。这可能是最简单,最有效的方法。 Split()将为您生成一个包含数据的字符串数组。

答案 5 :(得分:1)

创建一个编写器,用于计算写入的字符数,并使用它来包装OutputStreamWriter。

注意:将文本保存到文件的正确方法是:

new BufferedWriter( new OutputStreamWriter( new FileOutputStream( file ), encoding ) ) );

编码很重要;它通常是“UTF-8”。

这个链为您提供了两个可以注入包装器的地方:您可以包装编写器以获取字符数,或者包裹内部OutputStream以获取写入的字节。

答案 6 :(得分:0)

3:使用Scanner(自1.5起):懒惰(但是恶意)的程序员工具,具有字符串扫描目的所需的所有选项,并且对所有文件都有效。