对于scanner对象,hasNextLine()
方法返回true,而hasNext()
方法返回false,这是怎么回事?
注意:基于输入文件,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();
}
以下是我要传递给此扫描仪的文件的实际内容:
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
以下是我运行代码时在控制台中打印的内容的结尾,包括我无法理解的部分:
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
文件末尾有一个空行。
例如,如果您将内容保存到一个txt文件中,一些编辑器会在文件中添加一个空的新行。
编辑器的行为是这样的,因为这是POSIX标准的一部分:
3.206线路
零个或多个非字符加上一个终止字符的序列。
这个话题已经在这篇文章中讨论过了。
以下是Java 8 Scanner类的文档。
hasNext()
如果此扫描仪的输入中有另一个标记,则返回true。
hasNextLine()
如果此扫描仪的输入中有另一行,则返回true。
由于上述事实,hasNextLine()
将返回true
,但hasNext()
找不到任何可以识别为标记的内容,因此返回
false
。
更多信息请参见durron597帖子。
原因是hasNext()
检查是否还有更多可用的非空格字符。hasNextLine()
检查是否有另一行文本可用。您的文本文件末尾可能有一个换行符,因此它有另一行,但没有更多的非空格字符。
如果文件末尾没有换行符,许多文本编辑器会自动在文件末尾添加换行符。
换句话说,您的输入文件不是这样的(数字是行号):
1. a 3 9
2. b 3 6
3. c 3 3
4. d 2 8
5. e 2 5
实际上是这样的:
1. a 3 9
2. b 3 6
3. c 3 3
4. d 2 8
5. e 2 5
6.
hasNextLine()
检查缓冲区中是否有另一个linePattern
。hasNext()
检查缓冲区中是否有可解析的标记,由扫描仪的分隔符分隔。由于扫描仪的分隔符是空白,linePattern
也是空白,因此缓冲区中可能存在linePattern
,但没有可解析的标记。
通常,处理此问题的最常见方法是在解析文本每行中的所有标记(例如数字)后始终调用nextLine()
。当使用Scanner
从S
读取用户输入时,您需要执行此操作ystem.in。要使扫描仪前进超过此空格分隔符,您必须使用scanner.nextLine()
来清除行分隔符。请参阅:使用scanner.next()
附录:
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+")|.+$";
默认的令牌分隔符是这个Pattern
:
private static Pattern WHITESPACE_PATTERN = Pattern.compile(
"\\p{javaWhitespace}+");
问题内容: 题 对于扫描仪对象,该方法返回true,而该方法返回false的结果又如何呢? 注意:根据输入文件,该方法将按预期返回结果。在似乎没有被返回正确的结果。 码 这是我正在运行的创建以下结果的代码: 输入文件 以下是我传递给此扫描仪的文件的实际内容: 结果 以下是我运行代码时控制台中显示的内容的结尾,其中包括我无法理解的部分: 问题答案: 文件末尾有一个额外的换行符。 检查缓冲区中是否还有
问题内容: 我遇到了一个问题,即使它可以与他人正常工作,也无法使java.util.Scanner读取保存在记事本中的文本文件。基本上,当它尝试读取问题文件时,它完全是空手的- hasNextLine()为false,缓冲区为空,等等。我将其范围缩小到一个事实,即如果存在,它甚至不会读取第一行是文件中 任何地方 的卷曲报价。没有异常被抛出。请注意,同一文件上的BufferedReader没问题。
它仍然打印出10个“*”,但后来我得到了这个错误: 但是如果我使用hasNext而不是hasNextLine,它可以正常工作。 所以我想知道为什么hasNext有效,而hasNextLine无效。
问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码
我正在尝试通过对象读取命令。为了检查输入语法,我使用<code>sc。hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我看到了JavaAPI中描述的“MAY block and wait for Input”的情况。 方法何时阻塞,我如何控制它?有趣的是,在街区前的3个案例中,它工作得非常好。此外,JavaAPI还将描述为检查是否存在另一个Input的正确方法,从而使方
<代码>文档。all是DOM中的一个非原始对象,它是falsy。 例如,此代码不做任何事情: 有人能解释一下这是为什么吗?