【问题标题】:Java Console Application with jLine带有 jLine 的 Java 控制台应用程序
【发布时间】:2016-12-20 22:21:14
【问题描述】:

我有一个多线程 Java 控制台应用程序。其中一个线程正在读取用户的输入,而其他线程将一些数据打印到控制台。当用户键入输入时编写器线程打印某些内容时,就会出现问题。它打断了用户。

我在输出的开头写了“\r”以清除该行以便更好地查看。但是,我还想将用户在那一刻之前输入的内容打印到下一行。

例如,我想输入 123456 作为输入。但是当我输入 123 时,

>123

编写器线程打印“OUTPUT”。

>OUTPUT
>

我想显示我之前输入的内容(“123”),然后我将输入剩余的输入。

>OUTPUT
>123

有人建议我使用 jLine。但我无法实现。您能否通过提供 jLine 库的示例用法或建议替代解决方案来帮助我?

重要的是不要阻塞写线程。它必须在输出到达时打印输出。

【问题讨论】:

    标签: java console-application jline jline2


    【解决方案1】:

    你必须这样做:

    private synchronized static void println(ConsoleReader in, String text) throws IOException {
        in.printString("\r");
    
        in.printString(text + "\n");
    
        in.redrawLine();
        in.flushConsole();
    }
    

    它将覆盖现有的提示和用户输入,追加新行,然后在下面重新绘制提示和用户输入。

    你可以这样使用它:

    public static void main(String[] args) throws IOException {
        ConsoleReader in = new ConsoleReader();
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        println(in, new Date().toString());
                        Thread.sleep(100);
                    } catch (IOException | InterruptedException e) {
                        throw new IllegalStateException(e);
                    }
                }
            }
    
        }.start();
        while (true) {
            in.readLine("> ");
        }
    }
    

    这有一些问题。例如,长输入将从添加的文本下方“突出”。您可以使用退格键或“\033[2K”转义命令清除它。

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      相关资源
      最近更新 更多