我知道如何使用 Java 通过替换前一行将终端中的输出包含在一行中。例如:
System.out.print("old line");
Thread.sleep(3000);
System.out.print("\rnew line");
但是如果我有两行输出并且我想都被替换怎么办
/* array must have length divisible by 2 */
public void doPrinting(String[] array) {
for(int i = 0; i < array.length / 2; i++) {
System.out.println(array[i*2]);
System.out.println(array[i*2+1]);
Thread.sleep(3000);
//I imagine some fancy ascii crypticness shall go here?
}
所以,如果我打电话doPrinting(new String[]{"Old1", "Old2", "New1", "New2"})
,这应该看起来像,在 Mac 终端:
MyName$ java MyClass
Old1
Old2
然后暂停3秒,然后看起来像
MyName$ java MyClass
New1
New2
我怎样才能做到这一点?我在 Mac OS 上,正在通过终端运行我的 Java 主方法。理想的答案是添加代码来修改上述doPrinting
方法。
更新:在下面的一个答案之后,我尝试了这个:
String ANSI_CSI = "\\x1b[";
String[] array = {"old1","old2","new1","new2"};
System.out.print("\n\n");
for(int i = 0; i < array.length / 2; i++) {
System.out.print(ANSI_CSI + "2A"); // Up 2
System.out.print(ANSI_CSI + "K"); // Clear
System.out.println(array[i*2]);
System.out.print(ANSI_CSI + "K"); // Clear
System.out.println(array[i*2+1]);
Thread.sleep(3000);
}
但这只是在终端中给了我这个输出
MyName$ MyClass
\x1b[2A\x1b[Kold1
\x1b[Kold2
\x1b[2A\x1b[Knew1
\x1b[Knew2