避免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
,并允许有很多方法来控制控制台。