更新命令行应用程序状态

时间:2010-11-17 18:18:08

标签: java bash

我有一个命令行应用程序,当前打印的百分比正在增加。

1% 2% 3% 4% ...

输出是顺序的。但我已经看到了命令行工具,它们显示了更改,就好像它是内联更新一样。

1%

2%与第一个相同的位置

3%与第一个相同的位置

4%与第一个相同的位置

¿我怎样才能做到这一点?我正在使用Java,如果这很重要,应用程序将在linux上运行。

谢谢。

修改

我如何使用颜色?

2 个答案:

答案 0 :(得分:11)

在打印更新之前输出\r,然后刷新。这会将光标返回到第一列。

答案 1 :(得分:0)

这篇文章很老了,但是对于那些不想使用JavaCurses的人来说,我有written a couple small, lightweight utility classes来进行控制台重写和ANSI着色。代码在Scala中,但如果jar在你的类路径上,它可以从Java调用;源中有一个Java demo app,但在下面再现。已在OS X和Ubuntu上验证输出。

public class JavaConsoleDemo {
    private final ConsoleWriter screen;
    public JavaConsoleDemo(ConsoleWriter screen) {
        this.screen = screen;
    }

    public void rewriteWithColors(String name) throws Exception {
        screen.clearAll();
        screen
                .print(Red().and(BgYellow()).format("Hello"))
                .print(" ")
                .print(Yellow().format("World"));
        screen.display();

        Thread.sleep(1000);

        screen.clearAll();
        screen
                .print(Blue().and(BgWhite()).format("Hello"))
                .print(" ")
                .print(Magenta().and(BgBlue()).format("%s", name));
        screen.display();

        Thread.sleep(1000);
    }

    public void rewrite(String name) throws Exception {
        screen.clearAll();
        screen.print("Hello\nWorld");
        screen.display();

        Thread.sleep(1000);

        screen.clearAll();
        screen.print("Hello\n" + name);
        screen.display();

        Thread.sleep(1000);
    }

    public static void main(final String[] args) throws Exception {
        ConsoleWriter screen = new ConsoleWriter(System.out);
        JavaConsoleDemo demo = new JavaConsoleDemo(screen);
        demo.rewrite(args[0]);
        demo.rewriteWithColors(args[0]);
    }
}