Java 带有 jLine 的控制台应用程序
Java Console Application with jLine
我有一个多线程 java 控制台应用程序。其中一个线程正在读取用户的输入,而其他线程则将一些数据打印到控制台。当用户键入输入时编写器线程打印某些内容时会出现问题。它打断了用户。
我在输出的开头写了“\r”以清除行以便更好看。但是,我还想将用户在那一刻之前输入的内容打印到下一行。
例如,我想输入 123456 作为输入。但是当我输入 123 时,
>123
作者线程打印 "OUTPUT"。
>OUTPUT
>
我想显示我之前输入的内容("123"),然后我将输入剩余的输入。
>OUTPUT
>123
有人建议我使用 jLine。但我无法实现它。你能通过提供 jLine 库的示例用法或建议替代解决方案来帮助我吗?
重要的是不要阻塞编写器线程。它必须在到达时打印输出。
你必须这样做:
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("> ");
}
}
这有一些问题。例如,长输入将从下方添加的文本 "stick out"。您可以使用退格键或“\033[2K”转义命令清除它。
我有一个多线程 java 控制台应用程序。其中一个线程正在读取用户的输入,而其他线程则将一些数据打印到控制台。当用户键入输入时编写器线程打印某些内容时会出现问题。它打断了用户。
我在输出的开头写了“\r”以清除行以便更好看。但是,我还想将用户在那一刻之前输入的内容打印到下一行。
例如,我想输入 123456 作为输入。但是当我输入 123 时,
>123
作者线程打印 "OUTPUT"。
>OUTPUT
>
我想显示我之前输入的内容("123"),然后我将输入剩余的输入。
>OUTPUT
>123
有人建议我使用 jLine。但我无法实现它。你能通过提供 jLine 库的示例用法或建议替代解决方案来帮助我吗?
重要的是不要阻塞编写器线程。它必须在到达时打印输出。
你必须这样做:
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("> ");
}
}
这有一些问题。例如,长输入将从下方添加的文本 "stick out"。您可以使用退格键或“\033[2K”转义命令清除它。