0

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

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

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

>123

作家线程打印“输出”。

>OUTPUT
>

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

>OUTPUT
>123

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

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

4

1 回答 1

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”转义命令清除它。

于 2016-08-14T14:38:58.623 回答