如何在 Linux 终端上禁止或删除 Java stdin 中的转义代码字符



我在这里和其他地方做了一些研究,涵盖了这个问题的主题,我发现了jline3,它似乎是一个明确的解决方案,并提供了大量重要的跨平台优势和功能。

但是,作为更好地了解 Java 如何使用流读取器和输入(包括原始字节(以及在 Linux 终端中实现基于文本的基本冒险游戏的一种方式,我希望能够在用户输入时抑制或删除stdin中的箭头键转义码。

这似乎无法通过Scanner实现,而且我不确定如何使用 Java 将终端置于原始输入模式 - 如果有一种方法可以通过 shell 脚本实现它,到目前为止我无法找到方法。我正在使用一个基本的 shell 脚本来调用我的 Java 程序并传入一些系统属性,所以这也是一个很好的解决方案。

到目前为止,我已经使用了ByteBufferCharBufferDecoder等的组合,我已经从其他问题和一些初步研究中看到了这些组合,但无法实现我想要的东西。

我怎么能简单地让我的 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 操作系统上10的退格键字符代码。如果没有该行,它似乎执行删除(?

爪哇代码

Console console = System.console();    
int symbol = 0;
char character = 0;
String matchString = new String();
StringBuilder input = new StringBuilder();
Pattern allowed = Pattern.compile( "[a-z0-9 !@#$%^&*()_+-=]" );
Matcher matcher = null;
while ( true ) { // This is an arbitrary loop for the example
try {
symbol = console.reader().read();
if ( symbol == 10 ) { // 10 = Enter
break;
}
character = (char) symbol;
matchString = Character.toString( character );
matcher = allowed.matcher( matchString );
if ( matcher.find() ) {
input.append( character );
System.out.print( "r" + input );
}
} catch ( IOException e ) {
e.printStackTrace();
}
}
System.out.println( "nYou entered: " + input );

问题:

  1. 仍在研究退格功能,使用"空"字符(例如,char c = 0;(重写输入StringBuilder对象的字符并调整其大小。这最终可能根本行不通。

  2. 我一直无法找到一种方法来排除大写字母 A、B、C 和 D,它们遵循代表箭头键的转义码序列,所以我不得不禁止所有大写字母。我试图等到阅读器检测到不再输入,然后解析该输入,但未能成功实现。

  3. ">
  4. 插入"和"删除"等特殊键生成的字符代码包含仍会打印的数字。我还不确定如何在不禁止数字的情况下防止这种情况发生(与箭头键和大写字母的问题相同(。

最后,这些可能都不起作用或将受到相当大的限制,但是玩这个很有趣,如果情况更糟,我可以让退格删除整个输入字符串。输入命令不是游戏的主要方面。

您可以使用java.io.Console类。Console.writer()自动处理基础字符编码。Console.readLine()从用户那里检索一行文本,并等待他按 Enter 键终止。还有一堆其他方法可以帮助您制作命令行游戏。

根据需要更改正则表达式,以接受您认为正确或错误的内容。

public class PasscodeScanner {
public static void main(String args[]) {
Scanner key = new Scanner(System.in);
while(getInput(key)) {
//keep doing until we you're good
}
System.out.println("Congrats, you're good.");
}
private static boolean getInput(Scanner key) {
System.out.print("Enter your passcode: ");
String sentence = key.nextLine();
if(validate(sentence)) {
System.out.println("You are cleared");
return false;
}
return true;
}
private static boolean validate(String entered) {
//change regex as per your need
Pattern pattern = Pattern.compile("[a-z]");
Matcher matcher = pattern.matcher(entered);
if (matcher.find()) {
return true;
}
return false;
}
}

最新更新