避免来自 Java 标准输入流的控制序列(如 ^[[C)

Avoid control sequences(like ^[[C) from Java standard inputstream

代码:

import java.util.Scanner;
public class Try{
  public static void main(String args[]){
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a String : ");
    String s = sc.nextLine();
    System.out.println("The Entered String is : " + s);
    System.out.println("The Length of Entered String is : " + s.length());
    sc.close();
  }
}

输出:

┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $java Try
Enter a String : 
hello
The Entered String is : hello
The Length of Entered String is : 5
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $java Try
Enter a String : 
hello^[[C
The Entered String is : hello
The Length of Entered String is : 8

当我按下箭头键时 ^[[C 出现而不是光标移动(类似的事情发生在其他箭头键、转义键、home、end 上)!

这里发生的是字符串第二次包含字符 :

['h', 'e', 'l', 'l', 'o', '\x1b', '[', 'C']

所以,'\x1b', '[', 'C' 是从键盘发送到 shell 的字符序列,代表右箭头键(光标向前)。

我想要的是,这些字符不会出现在 shell 中,但光标会移动(根据按下的键向前、向后、回到原点、结束等)。

接受输入后的处理意义不大,主要目的是让光标移动!

我如何在 Java 中实现这一点?

[编辑]

唯一的目标是在使用该程序时为用户提供类似终端的体验。

所以我进行了大量的搜索和谷歌搜索,到目前为止我认为不可能直接从 Java.

但是,但是我们可以用 C++ 或 C 来实现这个以及更多。

因此,最好和最优化的解决方案是为此使用 C++ 库。

现在我不太了解任何此类预先存在的库(对于 Java)所以我编写了自己的 C++ 代码并使用 JNI 从 Java 调用它。

如果您认为对于这样一个小问题每次都这样做太复杂了,我已经创建了一个非常简单的 Java 库来完成这一切。

这是 GitHub 页面:https://github.com/Jaysmito101/SeriousConsole

使用起来非常简单

我的代码:

import com.jaysmito.sconsole.SeriousConsole;

import java.nio.file.*;
public class Main{
    public static void main(String[] args) throws Exception{
        SeriousConsole.initConsole(Path.of("").toAbsolutePath().toString() + "/libseriousconsole.so");
        SeriousConsole.print("Enter a String : ");
        String s = SeriousConsole.readLine();
        System.out.println("The String entered is: " + s);
    }
}

编译:

javac -cp SeriousConsole.jar Main.java

致运行:

java -cp .:SeriousConsole.jar Main

您可以从 GitHub link.

下载 jar 和 so 文件

注意:这个库是 java.io.Console

的更好版本