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我更新了代码,将退格字符添加到允许的字符中,并正确处理擦除。