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

Java 我的输出假设整个文件是一行,java,Java,我有一个包含五行的文本文件 public static void main(String args[]) throws FileNotFoundException { String inputFileName = "textfile.txt"; printFileStats(inputFileName); } public static void printFileStats(String fileName) throws FileNotFoundExceptio

我有一个包含五行的文本文件

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  

但是,如果我删除了读取文件中字数的功能,它将正确地表示行数(5)。为什么会发生这种情况?

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

Lines: 1  
Words: 10 
Characters: 0

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

下面是
标记
,而不是行:

Lines: 1  
Words: 10 
Characters: 0

所以它只是读下一个,下一个,下一个,不关心行尾。空格或
\n
通常被视为
空白
,因此像这样的方法对它们没有任何区别。

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

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

您的内部
,而
循环正在吞噬整个文件。你想数一数每行的字数,对吗?请尝试以下方法:

in.next();
请注意,在空格上拆分是一种非常简单的标记化(单词拆分)方法,只适用于像这里这样的简单示例


当然,您也可以执行
words+=line.split(\\s”).length而不是内部循环。

您的内部
,而
循环正在吞噬整个文件。你想数一数每行的字数,对吗?请尝试以下方法:

in.next();
请注意,在空格上拆分是一种非常简单的标记化(单词拆分)方法,只适用于像这里这样的简单示例


当然,您也可以执行
words+=line.split(\\s”).length而不是内部循环。

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

因此,您正在输入
while(in.hasNextLine())
循环,但随后您正在使用
while(in.hasNext())
循环使用整个文件,结果是1行10个字

->检查
hasNext()
使用的令牌是否有下线字符,然后增加行数

或:


使用
String line=scanner.nextLine()
精确获取一行,然后使用第二个扫描器获取该行的所有标记:
scanner2=new scanner(line);而(scanner2.hasNext())
原因是,
hasNext()
不关心换行符

因此,您正在输入
while(in.hasNextLine())
循环,但随后您正在使用
while(in.hasNext())
循环使用整个文件,结果是1行10个字

->检查
hasNext()
使用的令牌是否有下线字符,然后增加行数

或:


使用
String line=scanner.nextLine()
精确获取一行,然后使用第二个扫描器获取该行的所有标记:
scanner2=new scanner(line);(scanner2.hasNext())

您想解释一下它到底是做什么的吗?如果太麻烦的话,我会去别的地方研究,但我真的很感激!我想完全理解我注入程序的代码。什么是“\\s”?以前,您只是检查输入是否有新词/新行。我在这里所做的实际上是将该行读入一个变量(
String line=in.nextLine();
),然后我将该
String
拆分为一个更小的
String
s/单词数组(假设单词由空格分隔,在本例中是空格)。一旦我有了一个单词数组,我就可以看到它有多长,以便看到那一行有多少单词,然后我转到下一行。啊,刚才看到了你的编辑
“\\s”
是一个表示“任何空白字符”的正则表达式。正则表达式(regex)有一个学习曲线,但当你开始编程时;你会发现它们非常有用/有时是必要的。它们值一个谷歌;我喜欢提供概述信息。想解释一下它的确切用途吗?如果太麻烦的话,我会去别的地方研究,但我真的很感激!我想完全理解我注入程序的代码。什么是“\\s”?以前,您只是检查输入是否有新词/新行。我在这里所做的实际上是将该行读入一个变量(
String line=in.nextLine();
),然后我将该
String
拆分为一个更小的
String
s/单词数组(假设单词由空格分隔,在本例中是空格)。一旦我有了一个单词数组,我就可以看到它有多长,以便看到那一行有多少单词,然后我转到下一行。啊,刚才看到了你的编辑
“\\s”
是一个表示“任何空白字符”的正则表达式。正则表达式(regex)有一个学习曲线,但当你开始编程时;你会发现它们非常有用/有时是必要的。它们值一个谷歌;我喜欢提供概述信息。