尝试读取一个 500,000 行的大文件并将其存储在 java 中的数组中

问题描述 投票:0回答:2

检查不同排序算法的性能。我们得到了一个包含 500,000 个单词的 .txt 文件,这些文件将使用这些算法进行排序。我编写了读取文件并将单词存储在字符串数组中的方法。第一个

Scanner
计算行数,第二个
Scanner
使用计数器创建数组,但它只适用于行数少得多的文件。我不能真正分享文本文件的内容,它只是一个每行包含 1 个单词的文件。

当我尝试读取包含 500,000 行的文件时,我得到:

线程“main”中的异常 java.util.NoSuchElementException
在 java.base/java.util.Scanner.throwFor(Scanner.java:937)
在 java.base/java.util.Scanner.next(Scanner.java:1478)
在 Tester.readArray(Tester.java:81)
在 Tester.main(Tester.java:7)

你觉得是我的电脑不支持,还是我需要换个方法? 这是我的方法:

public static String[] readArray(String file) {
    int wordCounter = 0;
    try {
        Scanner s1 = new Scanner(new File(file));
        while (s1.hasNextLine()) {
            wordCounter = wordCounter + 1;
            s1.next();
        }
        s1.close();
        String[]words = new String[wordCounter];
        Scanner s2 = new Scanner(new File(file));
        for (int i = 0; i < wordCounter; i = i + 1) {
            words[i] = s2.next();
        }
        return words;
    }
    catch (FileNotFoundException e) {
    
    }
    return null;
}
java arrays sorting java.util.scanner readfile
2个回答
1
投票

所以对我来说用

hasNextLine()
替换
hasNext()
修复了异常。这与您的 PC 无关。 我认为当您的文件末尾有一个空行时,可能会发生此错误。因为,当我在文件末尾删除我正在读取的空行时,没有抛出异常。


0
投票

Scanner 的 hasNextLine() 方法检查输入中是否还有另一行,无论该行是否为空,而 hasNext() 使用定界符检查另一个标记。使用 hasNext() 可能会解决您的问题。检查此以获取更多信息hasNext()与hasNextLine()

但是,您正在使用 Scanner 类的 nextLine() 来获取总行数。这对于中小型文件可能很有效,但可能不适用于无法放入内存的超大文件。

public static long countLines(String file) {
try {
    return Files.lines(Paths.get(file)).parallel().count();
} catch (IOException e) {
    e.printStackTrace();
    return -1;
}

}

该方法使用parallel()方法创建一个并行的行流,通过使用多个线程并行处理行,可以提高大文件的性能。

© www.soinside.com 2019 - 2024. All rights reserved.