【问题标题】:What is the most efficient way to determine length of a text file?确定文本文件长度的最有效方法是什么?
【发布时间】:2012-04-02 04:32:13
【问题描述】:

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

  1. 使用 ArrayList,
  2. 使用 BufferedReader 扫描文件,标记开始,计算行数,然后重置回标记, 或
  3. ???

【问题讨论】:

  • 我们所说的文件大小是多少?
  • 几百行,但我想要任何大小文件的答案。

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


【解决方案1】:

使用ArrayList(您的选项#1)。使用BufferedReaderreadLine() 方法逐行读取您的文本文件。它简单、高效且可维护。

【讨论】:

  • 在 Java 7 中引入了一个新的包和类,java.nio.file.Files: List<String> allLines = Files.readAllLines(Paths.get(filename), Charset.forName("iso-8859-1"));
  • @Kennet,这种方法有什么性能改进
  • 我没有测试过。但是写起来比我通常倾向于做的要短得多。
【解决方案2】:

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

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

另外,如果你知道每行的平均大小,你可以尝试确定数组在base to lenght of file (file_size / line_avg_size)中的大小。

【讨论】:

    【解决方案3】:

    这取决于文件的大小和你需要什么样的效率:

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

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

    【讨论】:

      【解决方案4】:

      ArrayList 比你的第二个更可取。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        【解决方案6】:

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

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

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

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

        此链为您提供了两个可以注入包装器的位置:您可以包装 writer 以获取字符数或内部 OutputStream 以获取写入的字节数。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 扫描仪不提供任何方法来轻松确定文件的长度。
          • @trav1th :因为它不会在内存中加载文件,所以对于任何文件大小,它都是一个很好的工具(没有“堆空间”问题)。在 Java 7 nio.file.Files.size(PathOfFile) 中给出大小等有用的方法。这也是对3的回应???这可能表明第一种方法不是最合适的。
          猜你喜欢
          • 2011-12-06
          • 1970-01-01
          • 2011-02-03
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          • 2020-04-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多