为什么hasNext()为False,但hasNextLine()为True?

DRi*_*ich 61 java java.util.scanner

对于一个scanner对象,该hasNextLine()方法返回false时该hasNext()方法返回true是怎么回事?

注意:根据输入文件,该hasNext()方法将按预期返回结果; 在hasNextLine()似乎没有被返回正确的结果.

这是我正在运行的代码,它创建了以下结果:

public void ScannerTest(Reader fileReaderObject){
    Scanner scannerObj = new Scanner(fileReaderObject);

    for(int i = 1; scannerObj.hasNext(); i++){
        System.out.println(i + ": " + scannerObj.next());
        System.out.println("Has next line: " + scannerObj.hasNextLine());
        System.out.println("Has next: " + scannerObj.hasNext());
    }
    System.out.println();

    scannerObj.close();
}
Run Code Online (Sandbox Code Playgroud)

输入文件

以下是我传递给此扫描器的文件的实际内容:

a   3   9
b   3   6
c   3   3
d   2   8
e   2   5
f   2   2
g   1   7
h   1   4
i   1   1
Run Code Online (Sandbox Code Playgroud)

结果

以下是我运行代码时在控制台中打印的内容的结尾,并包含我无法理解的部分:

25: i
Has next line: true
Has next: true
26: 1
Has next line: true
Has next: true
27: 1
Has next line: true
Has next: false
Run Code Online (Sandbox Code Playgroud)

dur*_*597 58

在文件末尾有一个额外的换行符.

  • hasNextLine()检查linePattern缓冲区中是否还有另一个.
  • hasNext() 检查缓冲区中是否有可解析的令牌,由扫描器的分隔符分隔.

由于扫描器的分隔符是空格,并且linePattern也是空格,因此linePattern缓冲区中可能存在a 但没有可解析的令牌.

通常,通过nextLine()在解析文本的每一行中的所有标记(例如数字)之后始终调用来处理此问题的最常用方法.在使用Scanner读取用户输入时也需要这样做System.in.要使扫描程序超过此空白分隔符,必须使用scanner.nextLine()清除行分隔符.请参阅:使用scanner.nextLine()


附录:

LinePattern定义为Pattern匹配此:

private static final String LINE_SEPARATOR_PATTERN =
                                       "\r\n|[\n\r\u2028\u2029\u0085]";
private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$";
Run Code Online (Sandbox Code Playgroud)

默认的令牌分隔符是这样的Pattern:

private static Pattern WHITESPACE_PATTERN = Pattern.compile(
                                            "\\p{javaWhitespace}+");
Run Code Online (Sandbox Code Playgroud)


Dan*_*ore 15

原因是hasNext()检查是否有更多的非空白字符可用.hasNextLine()检查是否有另一行文字可用.您的文本文件可能在其末尾有一个换行符,因此它有另一行但没有更多的字符不是空格.

如果没有文件编辑器,许多文本编辑器会自动在文件末尾添加换行符.

换句话说,您的输入文件不是这个(数字是行号):

1. a   3   9
2. b   3   6
3. c   3   3
4. d   2   8
5. e   2   5
Run Code Online (Sandbox Code Playgroud)

实际上是这样的:

1. a   3   9
2. b   3   6
3. c   3   3
4. d   2   8
5. e   2   5
6. 
Run Code Online (Sandbox Code Playgroud)


kam*_*mwo 14

简短的回答

文件末尾有一个空行.


空行的原因

如果您将内容保存并将其保存为txt文件,则某些编辑器会在文件中添加一个空的新行.

编辑器的行为方式如此,因为这是POSIX标准的一部分:

3.206线

零个或多个非字符加上终止字符的序列.

本主题已在此主题中讨论过该主题.


Java Scanner文档

以下是Java 8 Scanner类的文档.

hasNext()

如果此扫描器的输入中有另一个标记,则返回true.


hasNextLine()

如果此扫描器的输入中有另一行,则返回true.


Java代码行为的原因

由于上述事实,hasNextLine()将返回true,但hasNext()找不到任何东西,它可以识别Token并返回false.

有关其他信息,请参阅durron597帖子.


Flo*_*etz 5

你正在消费next(),但要求hasNext()hasNextLine().next()默认情况下,将所有内容返回到下一个whitespace().因此,您正在遍历所有空白分隔的字符串,并且在每个字符串之后,您要询问的是nextLine().

i 1 1- > hasNextLine()?真正.hasNext()?也是如此.

1 1- > hasNextLine()?真正.hasNext()?也是如此(仍然是一个空白)

1- > hasNextLine()?真(Line Seperator,可能).haxNext?错,再也没有空格了.