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

4
我有一个数据文件,由多行数据组成,以换行符分隔。我需要将文件内容读入字符串数组,并希望以正确的大小高效地创建数组。最有效的方法是:
  1. 使用 ArrayList,
  2. 使用 BufferedReader 浏览文件,标记开始位置并计算行数,然后复位到标记位置,
  3. ???

我们谈论的是什么大小的文件? - moodywoody
几百行代码,但我希望能处理任何大小的文件。 - TravisThomas
7个回答

5

使用 ArrayList(第一种选项)读取文本文件,可以使用 BufferedReaderreadLine() 方法逐行读取。这种方法简单、高效且易于维护。


1
在Java 7中引入了一个新的包和类,java.nio.file.Files:List<String> allLines = Files.readAllLines(Paths.get(filename), Charset.forName("iso-8859-1")); - Kennet
@Kennet,这种方法有没有性能提升? - UVM
我还没有测试过那个。但是它比我通常倾向于做的要短得多。 - Kennet

2

这取决于文件的大小和您所需的效率:

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

  2. 将整个文件作为字符串读取并手动拆分(我认为更有效),或使用 java.lang.String 提供的正则表达式拆分成字符串数组。如果您手动执行此操作,可以计算“\r\n”符号的数量并创建大小精确的数组(即,您将节省数组列表重新分配的时间)。


2
您可以使用ArrayList,并使用以下方法来优化其大小:
  • trimToSize:将此ArrayList实例的容量修剪为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储。
  • ensureCapacity:如有必要,增加此ArrayList实例的容量,以确保它至少可以容纳由最小容量参数指定的元素数。
此外,如果您知道每行的平均大小,可以尝试根据文件长度(文件大小/行平均大小)确定数组的大小。

2

ArrayList比第二个更好。

我不想用自己的代码重新发明轮子,因为已经有被证实的解决方案了。


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

你可以尝试使用File.readFileToString:http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html#readFileToString%28java.io.File%29 - Oleksi

1

创建一个计算已写入字符数的Writer,并使用它来包装您的OutputStreamWriter。

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

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

编码很重要,通常为“UTF-8”。

这个链给了你两个地方可以注入你的包装器:你可以包装writer以获取字符数或内部OutputStream以获取字节数。


0

3:使用Scanner(自1.5版本以来):懒惰(但恶意的)程序员工具,具有所有用于字符串扫描目的的选项,并适用于所有文件。


Scanner类没有提供任何方法来轻松确定文件的长度。 - TravisThomas
@trav1th:因为它不会在内存中加载文件,对于任何大小的文件都是一个好工具(没有“堆空间”问题)。在Java 7中,nio.file.Files.size(PathOfFile)提供了文件大小以及其他有用的方法。这也是对3个问号的回答,表明第一种方法并不是最合适的。 - cl-r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接