我的输出是假设整个文件是一行

时间:2013-10-24 00:21:26

标签: java

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 个答案:

答案 0 :(得分:4)

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

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

请注意,拆分空格是一种非常天真的标记化(分词)方法,只适用于您在此处的简单示例。

当然,您也可以words += line.split("\\s").length;而不是内圈。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这将读取下一个Token,而不是行:

in.next();

所以它只是阅读下一个,下一个和下一个,并不关心行结束。空格或\n通常被视为white space,因此像这样的方法在它们之间没有任何区别。

答案 3 :(得分:0)

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

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

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

OR:

使用String line = scanner.nextLine()获取一行,然后使用第二台扫描程序获取该行的所有令牌:scanner2 = new Scanner(line); while(scanner2.hasNext())