Java控制台输出重叠扫描程序
我正在尝试创建一个控制台输入系统,同时可以打印输出:Java控制台输出重叠扫描程序,java,Java,我正在尝试创建一个控制台输入系统,同时可以打印输出: new Thread(() ->{ //asynchronous output test every 2 sec while(true) { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated c
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();
但是,当我输入时,同时有一个输出,结果如下:
测试
试验
我要试试
按类型测试
有没有一种方法可以始终在控制台底部显示输入行?解决方案是,每次用户键入并存储变量中实际写入的内容时,都获取用户的输入。然后,在编写“测试”之前,通过在控制台中多次打印
\b
来清除用户输入的字符数。之后,您可以再次打印用户的输入,使其感觉就像上面刚刚打印了“测试”
棘手的部分是在用户键入时获取其输入。我使用lib来实现这一点。此外,为了线程安全,我还确保“测试”打印线程以同步方式获取输入线
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();
}
}
私有静态字符串inputLine=”“;
同步静态字符串getInputLine(){
返回输入线;
}
同步静态void setInputLine(字符串行){
输入线=输入线;
}
公共静态void main(字符串[]args){
字符c;
允许的字符[]={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';
控制台阅读器;
PrintWriter out=新的PrintWriter(System.out);
新线程(()->{//每2秒进行一次异步输出测试
while(true){
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
String erase=”“;//准备一个字符串,只要输入包含\b个字符
对于(int i=0;i
此程序适用于我,但仅在IDE之外。请注意,程序处于无限循环中,因此如果要关闭它,必须使用“quit”命令从代码中处理它
编辑:还以同步方式设置输入行。System.out.println()在每次输入之前?否,输入文本显示在“Test”Test dddddd Test前面dddddddd@KevinMeyer我更新了代码,将退格字符添加到允许的字符中,并正确处理擦除。