2012-11-17 38 views
1

我正在嘗試編寫一個讀取多個文件並逐行比較它們的程序。要讀取的文件數量取自用戶,文件預計採用「input1.txt」,「input2.txt」等形式。當讀取nextLine()時出現「行不可用」錯誤;從文件掃描程序

當我嘗試運行我的代碼時,得到一個「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(); 
    } 
} 

}

回答

1

您收到此錯誤的原因是因爲當計數的行數的掃描對象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); 
+0

哦,快點!謝謝。 –