2011-12-02 68 views
4

我正在用Java編寫一個簡單的程序,它需要從文本文件讀取數據。但是,我在計算線路時遇到了問題。這個問題對於簡單的Google搜索似乎足夠通用,但我甚至可能不會搜索正確的東西。掃描儀上的文本文件hasNext()是無限的

我是從學習的教科書表明,計算在一個文本文件中的行數,你應該做這樣的事情:

public static int[] sampleDataArray(String inputFile) throws IOException 
{ 
     File file = new File(inputFile); 
     Scanner inFile = new Scanner(file); 

     int count = 0; 

     while (inFile.hasNext()) 
      count++; 

     int[] numbersArray = new int[count]; 

     inFile.reset(); 
     for (int i = 0; i < count; i++) 
     { 
      numbersArray[i] = inFile.nextInt(); 
     } 

     inFile.close(); 
     return numbersArray; 
} 

在我看來,該while (inFile.hasNext())線的問題。我認爲hasNext()運行無限。我在代碼中使用的數據文件絕對具有有限數量的數據行。

我應該怎麼辦?

+1

替換'INT []''由列表'。這樣您就不需要事先知道尺寸,並且可以節省您多一個循環。 – BalusC

回答

9

你叫hasNext()後的第一次,如果你不從文件中讀取hasNext()將始終返回true。因爲輸入的前面沒有改變。

想象一下,你在它與這一行文件:

這是輸入

如果您在本文件中調用hasNext(),它將返回true因爲在接下來的令牌文件,在這種情況下,字this

如果在初始調用之後沒有從文件讀取數據,則要處理的「下一個」輸入仍然是字this。直到您讀取文件後,下一個輸入纔會更改。

TL; DR

當你調用hasNext()從文件中讀取,否則你將永遠有一個無限循環。

此外

如果你真的想用hasNext(),或想,你可以創建另一個Scanner對象,並通過文件讀取數行,那麼你的循環將正常工作。此外,你應該真的使用hasNextLine()

public int countLines(File inFile) 
{ 
    int count = 0; 
    Scanner fileScanner = new Scanner(inFile); 

    while(fileScanner.hasNextLine()) //if you are trying to count lines 
    {        //you should use hasNextLine() 
     fileScanner.nextLine() //advance the inputstream 
     count++; 
    } 

    return count; 
} 

希望這是有幫助的。

+0

正是我想知道的。謝謝! – AvaMango

8

inFile.hasNext()指針不會移動到下一行

試試這個

String x=null; 
while((x = inFile.next()) != null) 
    count++; 

hasNext的說明()

返回true,如果此掃描器的輸入中有另一個標記。此方法可能會在等待輸入進行掃描時阻塞。掃描儀不會超過任何輸入。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#hasNext%28%29

+1

+1,你的方法更短:) –

+0

但是不認爲計算文件中的令牌數量,而不是數量? –

+0

簡短,簡單,甜美。我無法讓它工作。也許我做錯了什麼? – AvaMango

1

您不能使用掃描程序來計算文件中的行號,因爲默認掃描程序使用空白區分記號。我會建議使用BufferReader和readline方法。

http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html

private Integer getNoOfLines(String fileName) throws FileNotFoundException, 
     IOException { 
    FileInputStream fstream = new FileInputStream(fileName); 
    DataInputStream in = new DataInputStream(fstream); 
    BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
    String strLine; 
    List<String> lineList = new ArrayList<String>(); 
    while ((strLine = br.readLine()) != null) { 
     lineList.add(strLine); 
    } 
    in.close(); 
    return lineList.size(); 
} 
+1

您可以使用'Scanner'來計算文件中的行數。 'hasNext()'默認使用空格分隔標記,但'hasNextLine()'不包含。另外,你可以設置你想分離令牌的任何分隔符。 –

+0

是的。你是對的。 – nayakam

2

用於計數的行數使用hasNextLine(),代替hasNext()
while循環中,您應該調用nextLine(),因爲在您當前的實現中,掃描程序在第一行是靜態的。調用這個方法將使它移動到下一行,每次迭代循環。

請參考下面的代碼片斷:

while (inFile.hasNextLine()){ 
    inFile.nextLine() 
    count++; 
}