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 8 Scanner类的文档.
hasNext()
如果此扫描器的输入中有另一个标记,则返回true.
hasNextLine()
如果此扫描器的输入中有另一行,则返回true.
由于上述事实,hasNextLine()
将返回true
,但hasNext()
找不到任何东西,它可以识别Token
并返回false
.
有关其他信息,请参阅durron597帖子.
你正在消费next()
,但要求hasNext()
和hasNextLine()
.next()
默认情况下,将所有内容返回到下一个whitespace()
.因此,您正在遍历所有空白分隔的字符串,并且在每个字符串之后,您要询问的是nextLine()
.
i 1 1
- > hasNextLine()
?真正.hasNext()
?也是如此.
1 1
- > hasNextLine()
?真正.hasNext()
?也是如此(仍然是一个空白)
1
- > hasNextLine()
?真(Line Seperator,可能).haxNext?错,再也没有空格了.
归档时间: |
|
查看次数: |
15464 次 |
最近记录: |