2013-10-24 53 views
1
public static void main(String args[]) throws FileNotFoundException 
{  
    String inputFileName = "textfile.txt"; 

    printFileStats(inputFileName); 
} 
public static void printFileStats(String fileName) throws FileNotFoundException 
{ 
    String outputFileName = "outputtextfile.txt"; 
    File inputFile = new File(fileName); 
    Scanner in = new Scanner(inputFile); 
    PrintWriter out = new PrintWriter(outputFileName); 

    int lines = 0; 
    int words = 0; 
    int characters = 0; 

    while(in.hasNextLine()) 
    {    
     lines++;  
     while(in.hasNext()) 
     { 
      in.next(); 
      words++; 
     } 
    } 

    out.println("Lines: " + lines); 
    out.println("Words: " + words); 
    out.println("Characters: " + characters); 

    in.close(); 
    out.close(); 

} 

我有一個包含五條線我的輸出是假設整個文件是一個線

this is 
a text 
file 
full of stuff 
and lines 

一個文本文件的代碼創建一個輸出文件

Lines: 1 
Words: 10 
Characters: 0 

然而,如果刪除了能夠讀取文件中的字數,它正確地說明了行數(5)。這是爲什麼發生?

回答

4

你內心的while循環吞噬整個文件。你想要統計每一行的單詞數量,對嗎?試試這個:

while (in.hasNextLine()) 
{    
    lines++;  
    String line = in.nextLine(); 
    for (String word : line.split("\\s")) 
    { 
     words++; 
    } 
} 

注意在空間,分裂是一個很天真的做法,以符號化(字 - 分裂),只會像您這裏有一個簡單的例子工作。

當然,你也可以做words += line.split("\\s").length;而不是內部循環。

+0

護理解釋說,做什麼,到底是什麼?如果這太麻煩了,我會在其他地方進行研究,但是我真的很感激它!我想完全理解我正在注入我的程序中的代碼。 什麼是「\\ s」? – user2770254

+1

之前,您只是檢查您的輸入*是否有*新的單詞/行。我在這裏做的實際上是將行讀入一個變量('String line = in.nextLine();'),然後我將這個'String'拆分成一個更小的'String'/(假設單詞由空格分隔,在這種情況下它們是)。一旦我有了一系列單詞,我可以看到多長時間才能看到該單詞有多少單詞,然後轉到下一行。 – Josh

+1

啊,只是看到你的編輯。 '「\\ s」'是一個正則表達式,意思是「任何空格字符」。正則表達式(正則表達式)有一個學習曲線,但是當你進入編程時,你會發現它們非常有用/有時是必要的。他們值得谷歌;我喜歡[本網站](http://www.regular-expressions.info/)瞭解概述信息。 – Josh

0

這讀取下一Token,也不行:

in.next(); 

所以它只是讀取下一個和下一個和明年和不約行結束護理。空間或\n通常被認爲是white space,所以像這樣的方法在它們之間沒有任何區別。

1

in.hasNext() and in.next()將所有空白字符視爲字詞分隔符,包括換行符。你的內在循環正在吃掉所有的換行符,因爲它正在計算所有的單詞。

0

原因是,hasNext()不關心換行符。

所以,你正在進入while(in.hasNextLine())循環,但你正在使用while(in.hasNext())循環的整個文件,導致1行和10個字。

- >檢查EOL字符hasNext()消耗的令牌,然後增加行數。

OR:

使用String line = scanner.nextLine()獲取只有一個行,然後使用第二掃描儀獲取該行的所有令牌:scanner2 = new Scanner(line); while(scanner2.hasNext())

相關問題