java - 快速将文件读入字符串数组

标签 java

我需要从 java 读取一个包含 500,000 多行的文件,我想知道与我的代码相比是否有办法加快该过程:

    Scanner s1 = new Scanner(new FileInputStream(args[0]));
    while(s1.hasNextLine()) {
        temp += s1.nextLine() + "\n";
    }
    data = temp.split("\\s+");

开始时还好,但超过 200000 行后

temp += s1.nextLine() + "\n"

最终确实需要一段时间。我需要的最终格式是每个单词的字符串数组。

最佳答案

temp += s1.nextLine() + "\n"的原因花费很长时间是因为您正在生成大量字符串。事实上,对于读取的 N 个字符,您将生成 O(N) 个大字符串,并复制 O(N^2) 个字符。

解决方案(只是)是附加到 StringBuilder而不是使用String级联。然而,这并不是真正的解决方案,因为 temp字符串不是你的最终目标。您的最终目标是创建一系列单词。

真正需要做的是将每一行拆分为单词,然后累积单词。但是将它们直接累加到数组中效果不佳......因为数组无法扩展。因此,我建议您执行以下操作:

  1. 创建 ArrayList<String>容纳所有单词
  2. 读取每一行并将其拆分为单词数组
  3. 将数组中的单词附加到所有单词的列表中
  4. 完成后,请使用 List.toArray生成最终的单词数组...或者将单词保留在列表中(如果更合适的话)。

The final format I need is a string array of every word.

我将上面的内容理解为您想要文件中所有单词的列表。如果某个单词在文件中多次出现,它也应该在列表中出现多次。

另一方面,如果您想要文件中不同单词的列表,那么您应该使用 Set而不是List来积累单词。根据您想要对接下来的单词执行的操作,HashSet , TreeSetLinkedHashSet是合适的。

关于java - 快速将文件读入字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24297874/

相关文章:

java - 如何将消息从 vaadin 客户端类委托(delegate)给服务器类?

java - Android 滚轮在第一个滚轮滚动时滚动第二个滚轮

java - Java服务器套接字未检测到丢失的连接

c# - 如何使用适配器将自定义字体设置为 ListView 项中的 TextView 之一?

java - 多个身份验证提供程序 :/j_spring_security_check and social login

java - Maven 使用类别和配置文件运行特定测试不使用组标签

java - 反恶意软件服务可执行文件减慢 IO 操作

java - java中电影名称的字符串过滤

java - 监听器和验证/重画

java - 如何在 IntelliJ 中显示连接左大括号和右大括号的线?