scanner.skip(pattern) 为字符串和文件提供异常但不为 System.in

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

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());
    }
}

在从文件或字符串读取的情况下,如果模式在当前光标位置不匹配,则会抛出 java.util.NoSuchElementException

但在 System.in 的情况下,如果模式在当前光标位置不匹配,则不会抛出异常。相反,光标只是不断跳过输入。为什么?

对于文件和字符串,您的输入将被终止,而如果您向控制台输入更多字符,System.in 会继续向扫描仪提供数据。

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

echo xxx | java -cp your.jar Main