获取Java扫描器输入而不推进扫描器 在不推进扫描器的情况下获取扫描器的值-Java

获取Java扫描器输入而不推进扫描器 在不推进扫描器的情况下获取扫描器的值-Java,java,input,reflection,token,java.util.scanner,Java,Input,Reflection,Token,Java.util.scanner,我想在不推进的情况下获取扫描仪中输入的值。目前,我正在使用扫描仪作为系统输入 final var sc = new Scanner(System.in); 我知道扫描器上的hasNext方法,它们是目前我在不推进输入的情况下检查输入的最佳/唯一方法 例如,下面是如何确保来自sc的正整数输入 public static int getPositiveIntegerInput(Scanner sc) { System.out.println("Please input a positive

我想在不推进的情况下获取扫描仪中输入的值。目前,我正在使用扫描仪作为
系统输入

final var sc = new Scanner(System.in);
我知道扫描器上的
hasNext
方法,它们是目前我在不推进输入的情况下检查输入的最佳/唯一方法

例如,下面是如何确保来自
sc
的正整数输入

public static int getPositiveIntegerInput(Scanner sc) {
    System.out.println("Please input a positive integer");
    sc.useDelimiter("\n");
    while (!sc.hasNextInt() || sc.hasNext(".*[^\\d].*")) {
        System.out.println("Invalid input, please try again");
        sc.nextLine();
    }
    return sc.nextInt();
}
我想将检查
sc
的输入而不推进的概念扩展到实际获取
sc
的输入而不推进它

我一直在努力做到这一点 我已经详细介绍了
Scanner
上的
hasNext()
的实现细节

hasNext
的实现: 至少在我看来,可以从方法
getcompletetokeinbuffer
获取扫描仪的输入,但我真的不知道它是如何工作的。我不知道该方法是否单独获取scanner的值而不推进它,或者如果它推进它,那么其他东西会将其恢复到输入之前的状态,就好像它根本没有推进一样,或者它是否与其他东西结合获取,或者实际上是如何实现的

我一直在玩弄通过Java的反射API调用私有方法
Scanner
,试图实际返回持有
sc
的令牌的输入值,而不实际推进方法(但老实说,我只是玩弄它,不知道如何真正完成我想要做的事情)

注意:上述方法在获取
sc
的输入值之前不会等待输入,因此会返回
null
的值

目标:
只是重申一下,我想找到一个方法来捕获并返回
扫描器
对象的输入值,并实际推进它。

否则,您要查找的可能被称为peek函数


在另一个线程上,表示可能通过在实现此功能的Scanner周围创建一个包装类来为您服务,因为Scanner类本身并没有实现它。

否则,您要查找的可能被称为peek函数

在另一个线程上,表示可能通过在实现此功能的Scanner周围创建一个包装器类来为您服务,因为Scanner类本身并没有实现它。

public final class Scanner {

    public boolean hasNext(Pattern pattern) {
        ensureOpen();
        if (pattern == null)
            throw new NullPointerException();
        hasNextPattern = null;
        saveState();
        modCount++;

        while (true) {
            if (getCompleteTokenInBuffer(pattern) != null) {
                matchValid = true;
                cacheResult();
                return revertState(true);
            }
            if (needInput)
                readInput();
            else
                return revertState(false);
        }
    }
}
public static void main(String[] args) {

    final var sc = new Scanner(System.in);
    sc.useDelimiter("\n");

    var str = "";

    try {
        Method method = Scanner.class.getDeclaredMethod("getCompleteTokenInBuffer", Pattern.class);
        method.setAccessible(true);
        str = (String) method.invoke(sc, Pattern.compile(".*"));
    } catch (Exception e) {
        System.out.println("Well, that didn't work!");
        System.out.println("Exception: " + e);
    }

    System.out.println("getCompleteTokenInBuffer: " + str);

    // Prints: "getCompleteTokenInBuffer: null"
}