4

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

System.out.print("H")

然后我有:

System.out.print("I")

输出将是:

HI

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

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

它会首先打印出来

H

然后一秒钟后,将 H 替换为 I?

我敢肯定这听起来很愚蠢,我只是对没有 GUI 的动态更改内容感兴趣。有人可以为我指出这项技术的方向吗?非常感谢您提前。

4

4 回答 4

2

这就是您所需要的(使用回车 '\r' 覆盖先前的输出):

  System.out.print("H");
  Thread.sleep(1000);
  System.out.print("\rI");
于 2012-10-30T20:11:10.233 回答
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

于 2012-10-30T20:02:55.433 回答
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 控制台中不起作用,但在普通控制台中却可以。

于 2012-10-30T20:07:52.270 回答
1

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

于 2012-10-30T20:02:52.953 回答