读取下一行() 时"Line not available"错误;从文件扫描程序



我正试图编写一个程序,读取大量文件并逐行比较。要读取的文件数量取自用户,文件的格式应为"input1.txt"、"input2.txt"等

当我尝试运行我的代码时,我得到一个"NoSuchElementException",告诉我Scanner.nextLine()行:行不可用。这是在第50行,即:jthLine.add(myScanners.get(k - 1).nextLine());。我不明白为什么没有一行可以读,因为这已经在一个以最小行数为界的循环中完成了。

感谢您的帮助!这是我的代码:

// Compares n input files, prints the lines that are not equal in all.
import java.util.Scanner;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
public class CompareFiles {
public static void main(String[] args) throws IOException {
Scanner consoleScanner = new Scanner(System.in);
int numberOfFiles;
System.out.println("Please enter how many files are there. The" +
"file names should be like: input1.txt input2.txt, etc.");
numberOfFiles = consoleScanner.nextInt();
ArrayList<Scanner> myScanners = new ArrayList<Scanner>();
for (int k = 1; k <= numberOfFiles; k++)
myScanners.add(new Scanner(new File("input" + k + ".txt")));
// Find the file line counts.
ArrayList<Integer> lineCounts = new ArrayList<Integer>();
Integer lineCount;
String increment;
for (int i = 1; i <= numberOfFiles; i++) {
lineCount = 0;
while (myScanners.get(i - 1).hasNext()) {
increment = myScanners.get(i - 1).nextLine();
lineCount++;
}
lineCounts.add(lineCount);
}
// Find the minimum file count.
int minLineCount = Collections.min(lineCounts);
// Compare files until minLineCount line by line
// println all the unmatching lines from all files
// jthLine holds the incremented lines from all files
ArrayList<String> jthLine = new ArrayList<String>();
boolean allMenAreTheSame;
for (int j = 1; j <= minLineCount; j++) {
allMenAreTheSame = true; // are all jth lines the same?
for (int k = 1; k <= numberOfFiles; k++) {
jthLine.add(myScanners.get(k - 1).nextLine());
if (!jthLine.get(0).equals(jthLine.get(k)))
allMenAreTheSame = false;
}
if (!allMenAreTheSame) {
System.out.println();
System.out.println("Line number " + j + " is not the same" + 
"across all files, printing the lines:");
for (int k = 1; k <= numberOfFiles; k++) {
System.out.println("File: "input" + k + ".txt":");
System.out.println(jthLine.get(k - 1));
}
}
jthLine.clear();
}
}

}

出现此错误的原因是,在计算扫描程序对象myScanners.get(i - 1)到达文件末尾的行数时。所以,当您再次尝试从中读取时,它从您离开的地方开始,即文件的末尾。

有不同的方法,但我认为最简单的方法是创建新的扫描仪对象。

for (int i = 1; i <= numberOfFiles; i++) {
lineCount = 0;
while (myScanners.get(i - 1).hasNext()) {
increment = myScanners.get(i - 1).nextLine();
lineCount++;
}
lineCounts.add(lineCount);
}
myScanners.clear()
for (int k = 1; k <= numberOfFiles; k++)
myScanners.add(new Scanner(new File("input" + k + ".txt")));
// Find the minimum file count.
int minLineCount = Collections.min(lineCounts);

相关内容

最新更新