如何打印到同一行?

时间:2011-10-29 15:31:24

标签: java

我想像这样打印一个进度条:

[#                    ] 1%
[##                   ] 10%
[##########           ] 50%

但是这些应该全部打印到终端中的同一行而不是新行。 我的意思是每个新行应该替换前一行,而不是使用print()而不是println()

我怎么能用Java做到这一点?

8 个答案:

答案 0 :(得分:78)

将字符串格式化为:

[#                    ] 1%\r

请注意\r字符。这就是所谓的回车,它会将光标移回到行的开头。

最后,请确保使用

System.out.print()

而不是

System.out.println()

答案 1 :(得分:13)

在Linux中,控制终端有不同的转义序列。例如,擦除整行有特殊的转义序列:\33[2K和移动光标到前一行:\33[1A。所以你需要的是每次需要刷新线时打印它。以下是打印Line 1 (second variant)的代码:

System.out.println("Line 1 (first variant)");
System.out.print("\33[1A\33[2K");
System.out.println("Line 1 (second variant)");

有光标导航,清除屏幕等代码。

我认为有些库可以帮助它(ncurses?)。

答案 2 :(得分:10)

首先,我想为重新提出这个问题而道歉,但我觉得它可以使用另一个答案。

德瑞克舒尔茨是正确的。 '\ b'字符将打印光标向后移动一个字符,允许您覆盖在那里打印的字符(它不会删除整行,甚至不删除那里的字符,除非您在上面打印新信息)。以下是使用Java的进度条的示例,虽然它不遵循您的格式,它显示了如何解决覆盖字符的核心问题(这仅在Ubuntu 12.04中使用Oracle的Java 7在32位机器上进行了测试,但它应该适用于所有Java系统):

public class BackSpaceCharacterTest
{
    // the exception comes from the use of accessing the main thread
    public static void main(String[] args) throws InterruptedException
    {
        /*
            Notice the user of print as opposed to println:
            the '\b' char cannot go over the new line char.
        */
        System.out.print("Start[          ]");
        System.out.flush(); // the flush method prints it to the screen

        // 11 '\b' chars: 1 for the ']', the rest are for the spaces
        System.out.print("\b\b\b\b\b\b\b\b\b\b\b");
        System.out.flush();
        Thread.sleep(500); // just to make it easy to see the changes

        for(int i = 0; i < 10; i++)
        {
            System.out.print("."); //overwrites a space
            System.out.flush();
            Thread.sleep(100);
        }

        System.out.print("] Done\n"); //overwrites the ']' + adds chars
        System.out.flush();
    }
}

答案 3 :(得分:2)

您可以根据需要多次打印退格字符'\ b',以便在打印更新的进度条之前删除该行。

答案 4 :(得分:1)

package org.surthi.tutorial.concurrency;

public class IncrementalPrintingSystem {
    public static void main(String...args) {
        new Thread(()-> {
           int i = 0;
           while(i++ < 100) {
               System.out.print("[");
               int j=0;
               while(j++<i){
                  System.out.print("#");
               }
               while(j++<100){
                  System.out.print(" ");
               }
               System.out.print("] : "+ i+"%");
               try {
                  Thread.sleep(1000l);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
               System.out.print("\r");
           }
        }).start();
    }
}

答案 5 :(得分:0)

在科特林

print()

print语句将其中的所有内容打印到屏幕上。 打印语句内部调用System.out.print

println()

println语句在输出末尾添加换行符。

答案 6 :(得分:-1)

一个人可以简单地使用\r将所有内容保持在同一行中,同时擦除之前在该行中的内容。

答案 7 :(得分:-3)

您可以做

System.out.print("String");

相反

System.out.println("String");