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)。为什么会这样?
答案 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())