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