获取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"
}