我在这里和其他地方做了一些研究,涵盖了这个问题的主题,我发现了jline3,它似乎是一个明确的解决方案,并提供了大量重要的跨平台优势和功能。
但是,作为更好地了解 Java 如何使用流读取器和输入(包括原始字节(以及在 Linux 终端中实现基于文本的基本冒险游戏的一种方式,我希望能够在用户输入时抑制或删除stdin
中的箭头键转义码。
这似乎无法通过Scanner
实现,而且我不确定如何使用 Java 将终端置于原始输入模式 - 如果有一种方法可以通过 shell 脚本实现它,到目前为止我无法找到方法。我正在使用一个基本的 shell 脚本来调用我的 Java 程序并传入一些系统属性,所以这也是一个很好的解决方案。
到目前为止,我已经使用了ByteBuffer
、CharBuffer
、Decoder
等的组合,我已经从其他问题和一些初步研究中看到了这些组合,但无法实现我想要的东西。
我怎么能简单地让我的 Java 程序等待用户输入而不显示或捕获箭头键转义字符(例如,^[[A
、^[[B
(?
感谢您提供任何帮助或其他资源。
编辑/更新:
感谢所有对这个问题的回答。最终,我正在研究一个几乎完全符合我想要的解决方案,并且是 JavaConsole
类及其正则表达式功能的组合。
下面是一个非常基本的框架。从本质上讲,我选择了排除所有字符,包括一些禁止所有字符的方法,但我编译成允许打印到屏幕上的Pattern
字符。
这也让我可以测试其他重要的输入键,如 Enter 以进入和退出游戏的命令模式,因为我希望游戏对"移动"键做出反应,并让用户能够按 Enter 并键入一些命令。
我不得不摆弄stty
以允许这个解决方案,并且 Java 应用程序是通过 bash 脚本启动的。
砰脚本:
#!/bin/bash
# Save current terminal settings
STTY_SAVE=$(stty -g)
# Disable need to press [Enter] in order to have input processed
stty cbreak
# Disable the echoing of input
stty -echo
# Tell the terminal that erasure on the console should produce a backspace cursor movement
stty erase ^H
# Execute application
java reader_testing.Main
# Restore saved terminal settings
stty $STTY_SAVE
exit 0
注意:stty erase ^H
似乎也允许 Java 中的Console
捕获 *nix 操作系统上