有没有办法在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动态更改内容感兴趣。有人能指出我这个技术的方向吗?非常感谢你提前。
答案 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");