如何编写模仿sbt的Java应用程序';正在更改控制台屏幕中的文本输出(在解析依赖项时)?

如何编写模仿sbt的Java应用程序';正在更改控制台屏幕中的文本输出(在解析依赖项时)?,java,console,sbt,Java,Console,Sbt,启动sbt时,以下行与[info]解析的部分保持在同一行,而org.fusesource.jansi#jansi;1.4…零件不断更改,显示正在解析的库 [info] Resolving org.fusesource.jansi#jansi;1.4 ... 我的问题是: 这叫什么 如何编写一个Java程序来实现这种效果 我不明白有什么困难。据我所知,它没有具体的名字。至于实现这一目标——确实非常简单。您有一个文本字符串模板:解析%1$s…。-然后使用字符串。使用不同的参数格式化,并将结果设置到

启动
sbt
时,以下行与
[info]解析的部分保持在同一行,而
org.fusesource.jansi#jansi;1.4…
零件不断更改,显示正在解析的库

[info] Resolving org.fusesource.jansi#jansi;1.4 ...
我的问题是:

  • 这叫什么
  • 如何编写一个Java程序来实现这种效果

  • 我不明白有什么困难。据我所知,它没有具体的名字。至于实现这一目标——确实非常简单。您有一个文本字符串模板:
    解析%1$s…。
    -然后使用
    字符串。使用不同的参数格式化
    ,并将结果设置到文本字段中。

    这是在
    sbt
    中完成的,在写入更新的值之前,使用转义序列擦除以前的输出。查看trait的实现以了解详细信息

    下面是这项技术的一个示例。Windows上需要该库:

    import org.fusesource.jansi.AnsiConsole;
    
    public class Main {
    
        public static void main(String[] args) throws InterruptedException {
            AnsiConsole.systemInstall();
            for (int i = 0; i < 100; i++) {
                System.out.print("Hello, world " + i + "% complete\n");
                Thread.sleep(200);
                System.out.print("\u001B[1A\u001B[2K");
            }
        }
    }
    
    import org.fusesource.jansi.AnsiConsole;
    公共班机{
    公共静态void main(字符串[]args)引发InterruptedException{
    AnsiConsole.systemInstall();
    对于(int i=0;i<100;i++){
    System.out.print(“你好,世界”+i+%complete\n”);
    睡眠(200);
    系统输出打印(“\u001B[1A\u001B[2K”);
    }
    }
    }
    
    我觉得很难理解的是,文本是在适当的位置更改的。它不是以通常的方式在屏幕上逐行打印出来的。:)你也知道Mac/Linux的方式吗?我运行了它,输出仍然是“Hello,world 0%完成Hello,world 1%完成Hello,world 2%完成Hello,world 3%完成”我发现了原因!奇怪的是,如果我在eclipse中执行该程序,它仍然是逐行显示的,但是如果我直接在命令行上执行它,这就是所需的行为。