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

4 回答 4

4

您的内部while循环正在吞噬整个文件。您想计算每行中的单词数,对吗?试试这个:

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

请注意,在空格上拆分是一种非常幼稚的标记化方法(单词拆分),并且仅适用于您在此处拥有的简单示例。

当然,你也可以words += line.split("\\s").length;代替那个内部循环。

于 2013-10-24T00:28:13.093 回答
1

in.hasNext()并将in.next()所有空白字符视为单词分隔符,包括换行符。你的内部循环正在吃掉所有的换行符,因为它正在计算所有的单词。

于 2013-10-24T00:27:47.457 回答
0

接下来是下一个Token,而不是行:

in.next();

所以它只是阅读下一个、下一个和下一个,而不关心行尾。Space or通常\n被认为white space是,所以像这样的方法在它们之间没有任何区别。

于 2013-10-24T00:27:28.497 回答
0

原因是,它hasNext()不关心换行符。

因此,您正在进入while(in.hasNextLine())循环,但随后您正在使用循环消耗整个文件while(in.hasNext()),导致 1 行和 10 个单词。

-> 检查 EOL-Characters 消耗的令牌hasNext(),然后增加行数。

或者:

用于String line = scanner.nextLine()准确获取 ONE 行,然后使用第二个扫描仪获取该行的所有标记:scanner2 = new Scanner(line); while(scanner2.hasNext())

于 2013-10-24T00:28:38.710 回答