避免Java标准inputstream中的控制序列(如^[[C])

避免Java标准inputstream中的控制序列(如^[[C]),java,shell,input,stdin,Java,Shell,Input,Stdin,代码: 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 E

代码:

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显示,而不是光标移动(其他箭头键、escape键、home键、end键也会出现类似情况)

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

['h', 'e', 'l', 'l', 'o', '\x1b', '[', 'C']
因此,'\x1b'、'['、'C'是从键盘发送到shell的字符序列,用于表示向右箭头键(光标向前)

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

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

如何在Java中实现这一点

[编辑]
唯一的目标是在使用程序时给用户一个完全类似终端的体验。

所以我做了大量的搜索和谷歌搜索,到目前为止,我认为直接从Java不可能做到这一点

<> >但是,我们可以用C++或C.</P>实现这一点。 <> P>这样,最好的和最理想的解决方案是使用C++库来实现。 现在我对这种预先存在的库(java)了解不多,所以我编写了自己的C++代码,java使用jnI.< /p>调用它。 如果你觉得每次都这么小的问题太复杂,我已经创建了一个非常简单的Java库来完成所有这些

以下是GitHub页面:

它的使用非常简单

我的代码:

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链接下载jar和so文件


注意:这个库应该是一个更好的
java.io.Console

版本,我不确定这是否可以从java本身实现,因为您的命令行首先处理按键并将其映射到这些控制字符。java随后将从shell接收输入,而不是相反。@Thomas据我所知,这是可能的对于C ANS C++,而java不是sure@Thomas我会调查它,如果我能找到一个解决方案,我会更新它here@Thomas但是您提供的链接是针对C的,但是Java控制台类非常有限,提供的内容也不多!哦,是的,您是对的。我的错,没有检查这个。我将删除注释。很好!它比这些更好吗?,@rustyx我不知道如何比较它取决于谁会使用它,但主要的区别是(因为我的库还没有完成,我已经计划了更多的事情)您所说的库主要是gnu readline包装器,但我打算用我的库来做的是拥有一个更好版本的java.io.Console,我的意思是有更多的方法来控制控制台,比如彩色输出,以及我打算添加
ncurses
,并允许有很多方法来控制控制台。