如何删除打印到控制台/终端的前一个字符?

时间:2012-10-30 19:53:04

标签: java

有没有办法在Java中动态更改输出?例如,如果我有终端窗口:

System.out.print("H")

然后我有:

System.out.print("I")

输出将是:

HI

有没有办法为输出分配位置,允许您动态替换字符?例如(我知道这不会输出我想要的东西,我只是想表明我的想法):

 System.out.print("H")
 Thread.sleep("1")
 System.out.print("I")

它会首先打印出来

H

然后一秒后,用一个I替换H?

我确信这听起来很愚蠢,我只对没有GUI动态更改内容感兴趣。有人能指出我这个技术的方向吗?非常感谢你提前。

4 个答案:

答案 0 :(得分:2)

您可能需要查看

System.out.printf

查看此处显示的示例:http://masterex.github.com/archive/2011/10/23/java-cli-progress-bar.html

编辑:

printf显示格式化的字符串,这意味着您可以调整该格式并根据需要进行更改。

例如,您可以执行以下操作:

String[] planets = {"Mars", "Earth", "Jupiter"};        
String format = "\r%s says Hello";

for(String planet : planets) {
    System.out.printf(format, planet);
try { 
        Thread.sleep(1000); 
    }catch(Exception e) { 
        //... oh dear
    }
}

使用此处的格式化字符串语法:http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax

正如评论所说,这个解决方案只限于一条奇异的线,但这取决于你的需要,这可能就足够了。

如果您需要整个屏幕的解决方案,那么可能的解决方案(尽管非常脏)将是使用JNA挂钩操作系统并获取控制台窗口的句柄,找到它的高度然后循环println() “清除”窗口然后重绘输出。

如果您想阅读更多内容,我可以回答更多问题,或者这是一个链接:https://github.com/twall/jna

答案 1 :(得分:2)

您可以使用\b退格并删除上一个字符。

$ cat T.java
import java.lang.Thread;

public class T {
    public static void main(String... args) throws Exception {
        System.out.print("H");
        System.out.flush();
        Thread.sleep(1000);
        System.out.print("\bI\n");
        System.out.flush();
    }
}
$ javac T.java && java T
I

它将输出H,然后在一秒后将其替换为I

可悲的是,它在Eclipse控制台中不起作用,但在普通的控制台中却可以。

答案 2 :(得分:1)

通常用于执行此类操作的C库称为curses。 (也用于依赖于绑定到C库的脚本语言,如Python。)您可以使用Java绑定,例如JCurses。谷歌还告诉我一个名为lanterna的纯Java等价物。

答案 3 :(得分:1)

这是你需要的(使用回车符'\ r'来覆盖以前的输出):

  System.out.print("H");
  Thread.sleep(1000);
  System.out.print("\rI");