scanner.skip(pattern) 为 String 和 File 提供 Exception,但不为 System.in

scanner.skip(pattern) gives Exception for String and File but not for System.in

提问人:Robert Page 提问时间:4/29/2021 最后编辑:PshemoRobert Page 更新时间:4/29/2021 访问量:107

问:

import java.io.*;
import java.util.*;

class Main{
    public static void main(String[] args) throws Exception {
        File f = new File("x.txt"); //x.txt has "xxx" 
        String x = "xxx";
        //Scanner s = new Scanner(System.in);
        Scanner s = new Scanner(f);
        //Scanner s = new Scanner(x);
        s.skip("g");
        System.out.println(s.nextLine());
    }
}

如果从 File 或 String 读取,则如果 pattern 在当前光标位置不匹配,则会被抛出。java.util.NoSuchElementException

但是,如果没有,如果图案在当前光标位置不匹配,则会引发异常。相反,光标只是不断跳过输入。为什么?System.in

Java 正则表达式 java.util.scanner

评论


答:

1赞 DuncG 4/29/2021 #1

对于 File 和 String,您的输入将终止,而如果您在控制台中键入更多字符,则 System.in 会持续向 Scanner 提供数据。

如果它被终止,您可以看到与 System.in 相同的结果。此示例提供了一组固定的值,用于 System.in Java 进程,以便读取流的结尾,您将获得:java.util.NoSuchElementException

echo xxx | java -cp your.jar Main

评论

0赞 Pshemo 5/1/2021
只是为了添加 IMO 核心方面。 不只是处理单个令牌,例如实例方法。 方法可以处理整个文本,这就是为什么在正则表达式不匹配的情况下,扫描程序不会假设它根本不匹配。相反,它希望通过等待整个数据(直到数据源结束/关闭)来做出决定。虽然从理论上讲,它可以进行优化,例如,当正则表达式具有明显的最大长度时,这种优化不包括在正则表达式/跳过方法中。skipnextskipskip("abc")