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

时间:2014-06-19 02:31:29

标签: 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”

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

2 个答案:

答案 0 :(得分:2)

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

(仅)附加到StringBuilder而不是使用String连接的解决方案。但是,这不是真正的解决方案,因为temp字符串不是您的最终目标。你的最终目标是创造一系列文字。

你真正需要做的是将每一行分成单词,然后积累单词。但是将它们直接累积到一个数组中会很有效...因为数组不能扩展。所以我建议您执行以下操作:

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

  5.   

    我需要的最终格式是每个单词的字符串数组。

    我在上面读到这个意思是你想要一个文件中所有单词的列表。如果文件中出现多次单词,则该单词应在列表中多次出现。

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

答案 1 :(得分:0)

你感兴趣的是每个单词吗?还是每一行? 此外,您希望数组包含每个单词的字符串或每行的字符串..? 无论哪种方式,正如斯蒂芬所说,ArrayList是一种更好的方法。

你可以:

ArrayList<String> list = new ArrayList<>();

// each line as a string..
while (yourScanner.hasNextLine())
{
    list.add(yourScanner.nextLine());
}

// each word as a string..
while (yourScanner.hasNext())
{
    list.add(yourScanner.next());
}

字符串连接可能很昂贵,特别是在使用'temp'变量解决方案时达到200,00个单词......