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

Java 如何删除以前打印到控制台/终端的字符?,java,Java,有没有一种方法可以在Java中动态更改输出?例如,在终端窗口中,如果我有: System.out.print("H") 然后我有: System.out.print("I") 输出将是: HI 有没有一种方法可以为输出分配一个位置,允许您动态替换字符?例如(我知道这不会输出我想要的,我只想展示我的想法)如下: 它会先打印出来 H 一秒钟后,用I替换H 我确信这听起来很愚蠢,我只是对不使用GUI动态更改内容感兴趣。有人能为我指出这项技术的方向吗?非常感谢您。通常用于执行此类操作的C库被称为

有没有一种方法可以在Java中动态更改输出?例如,在终端窗口中,如果我有:

System.out.print("H")
然后我有:

System.out.print("I")
输出将是:

HI
有没有一种方法可以为输出分配一个位置,允许您动态替换字符?例如(我知道这不会输出我想要的,我只想展示我的想法)如下:

它会先打印出来

H
一秒钟后,用I替换H


我确信这听起来很愚蠢,我只是对不使用GUI动态更改内容感兴趣。有人能为我指出这项技术的方向吗?非常感谢您。

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

你可能想看看

System.out.printf
请看以下示例:

编辑:

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
    }
}
使用此处的格式化字符串语法:

正如评论所说,这种解决方案仅限于一行,但取决于您的需要,这可能就足够了

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


如果您想阅读更多内容,那么我可以回答更多问题,或者这里有一个链接:

您可以使用
\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
,然后在1秒后将其替换为
I

遗憾的是,它在Eclipse控制台中不起作用,但在普通控制台中起作用。

这就是您需要的(使用回车“\r”覆盖以前的输出):


好吧,在控制台里你不能这么做。如果不重新执行代码,就不能忽略已经显示的输出。好的,谢谢!那就是我所需要知道的!可能重复:该示例的一个限制是,它只显示了如何重新绘制当前行。我更新了有关printf的更多内容和另一种解决方案。我想到的另一件事是:我相信
\r
只是将光标移到行的开头。这意味着它不会删除您以前写的所有内容,而是覆盖前面的字符。这意味着用较短的行替换一行有点棘手,您必须用空格覆盖其余的行。(我刚刚去验证了上面的内容,确实是这样。)\r代表“回车符”,意味着它将返回到行的开头,如果您想清除较短的行,可以使用padding System.out.println(String.format(“[%-20s]”,即“Earth”);将给你:[地球](地球后15个空格)
$ 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
  System.out.print("H");
  Thread.sleep(1000);
  System.out.print("\rI");