提问人:Maggie RIv 提问时间:3/13/2023 最后编辑:Maggie RIv 更新时间:3/13/2023 访问量:114
尝试读取一个 500,000 行的大文件并将其存储在 java 中的数组中
Trying to read a big file of 500,000 lines and store it in an array in java
问:
检查不同排序算法的性能。我们得到了一个包含 500,000 个单词的.txt文件,这些文件将使用这些算法进行排序。我编写了读取文件并将单词存储在 String 数组中的方法。第一个计算行数,第二个使用计数器创建数组,但它仅适用于行数少得多的文件。我不能真正分享文本文件的内容,它只是一个每行包含 1 个单词的文件。Scanner
Scanner
当我尝试读取包含 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;
}
答:
所以对我来说,替换为固定的异常。这与您的 PC 无关。
我认为当您在文件末尾有一个空行时,可能会发生此错误。因为,当我删除我正在读取的文件末尾的空行时,没有抛出异常。hasNextLine()
hasNext()
评论
FileNotFoundException
printStackTrace()
Scanner
hasNextLine()
nextLine()
Scanner
BufferedReader
readLine()
Scanner
Scanner
BufferedReader
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() 方法创建并行行行流,这可以通过使用多个线程并行处理行来提高大文件的性能。
评论
hasNextLine()
next()
hasNext()
nextLine()
FileNotFoundException
next()
nextLine()
ArrayList
add()