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

Posted

技术标签:

【中文标题】避免来自 Java 标准输入流的控制序列(如 ^[[C)【英文标题】:Avoid control sequences(like ^[[C) from Java standard inputstream 【发布时间】:2021-03-31 11:02:47 【问题描述】:

代码:

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' 是从键盘发送到外壳的字符序列,用于表示右箭头键(向前光标)。

我想要的是这些字符不会显示在外壳中,但光标会移动(根据按下的键向前、向后、到家、结束等)。

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

如何在 Java 中实现这一点?

[编辑]

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

【问题讨论】:

我不确定这是否可以从 Java 本身实现,因为击键首先由您的命令行处理并映射到这些控制字符。然后 Java 将接收来自 shell 的输入,而不是相反。 @Thomas 据我所知它可能适用于 c 和 c++ 但 java 我不确定 @Thomas 我会调查它,如果我能找到解决方案,我会在这里更新它 @Thomas 但您提供的链接是针对 C# 的,但 Java 控制台类非常有限,提供的内容不多! 哦,是的,你是对的。我的错,没有检查这个。我会删除评论。 【参考方案1】:

所以我做了很多搜索和谷歌搜索,到目前为止,我认为直接从 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 链接下载 jar 和 so 文件。

注意:这个库是java.io.Console的更好版本

【讨论】:

不错!它比这些更好吗? 1, 2, 3 @rustyx 我不知道如何比较它取决于使用它的人,但主要区别是(因为我的图书馆还没有完成,我已经计划了更多的事情)你所说的库主要是 gnu readline 包装器,但我打算用我的库做的是有一个a better version of java.io.Console,我的意思是更多的方法来控制控制台,如彩色输出,以及我打算添加@ 987654330@ 并允许通过多种方式控制控制台。

以上是关于避免来自 Java 标准输入流的控制序列(如 ^[[C)的主要内容,如果未能解决你的问题,请参考以下文章

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

Java IO流--标准输入,输出流的使用

java IO流 其它的流的使用

具有并发输入/输出流的 Java 进程

Java输入输出流的使用详细介绍

java 21 - 11 IO流的标准输入流和标准输出流