gpt4 book ai didi

Java 控制台输出重叠扫描器

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:36 25 4
gpt4 key购买 nike

我正在尝试创建一个控制台输入系统,同时能够打印输出:

new Thread(() ->{ //asynchronous output test every 2 sec
while(true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("test");
}
}).start();

这是我获取用户输入的方式:

String line = scanner.nextLine();

然而,当我输入时,同时有一个输出,结果是这样的:

Test
Test
TestI'm try
Testing to type

有没有办法让输入行一直显示在控制台的底部?

最佳答案

解决方案是在用户每次键入时获取用户输入并将实际写入的内容存储在变量中。然后,在编写“测试”之前,通过在控制台中多次打印 \b 来清除用户输入的字符数。之后,您可以再次打印用户的输入,使其感觉就像上面刚刚打印了“测试”一样。

棘手的部分是在用户键入时获取用户的输入。我用了JLine lib 以实现这一目标。我还确保“测试”打印线程以同步方式获取 inputLine 以确保线程安全。

private static String inputLine = "";

synchronized static String getInputLine() {
return inputLine;
}

synchronized static void setInputLine(String line) {
inputLine = line;
}

public static void main(String[] args) {

char c;
char allowed[] = {'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','\n','\r','\b'};

ConsoleReader reader;
PrintWriter out = new PrintWriter(System.out);

new Thread(() ->{ //Asynchronous output test every 2 sec
while(true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}

String erase = ""; //Prepare a string as long as the input made \b characters
for(int i = 0 ; i < getInputLine().length() ; i++)
erase += '\b';

String whitespace = ""; //Prepare a string of whitespaces to override the characters after "test" (thus -4)
for(int i = 0 ; i < getInputLine().length() - 4 ; i++)
whitespace += ' ';

out.print(erase); //Erase the input line
out.println("test" + whitespace);
out.print(getInputLine());
out.flush();
}
}).start();

try {
reader = new ConsoleReader();
reader.setBellEnabled(false);

while(true){
c = (char) reader.readCharacter(allowed);

if(c == '\r' || c == '\n') {

//Do something with the input

setInputLine("");
out.println();
} else if(c == '\b') { //Backspace
String line = getInputLine();
setInputLine(line.substring(0, line.length()-1));
out.print(c);
out.print(" "); //Print whitespace to erase trailing char
out.print(c); //Backspace again to send the carret back to the last char
} else {
setInputLine(getInputLine() + c);
out.print(c);
}

out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}

这个程序对我有用,但只能在我的 IDE 之外使用。请注意,该程序陷入了无限循环,因此如果您想将其关闭,您必须使用例如“退出”命令从代码中处理它。

编辑:还以同步方式设置 inputLine。

关于Java 控制台输出重叠扫描器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com