Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: Updating text in the command-line without a new line

I'd like to add a progress indicator to a command-line Java program.

For example, if I'm using wget, it shows:

71% [===========================>           ] 358,756,352 51.2M/s  eta 3s 

Is it possible to have a progress indicator that updates without adding a new line to the bottom?

Thanks.

like image 420
Tom Marthenal Avatar asked Jan 01 '11 03:01

Tom Marthenal


1 Answers

I use following code:

public static void main(String[] args) {     long total = 235;     long startTime = System.currentTimeMillis();      for (int i = 1; i <= total; i = i + 3) {         try {             Thread.sleep(50);             printProgress(startTime, total, i);         } catch (InterruptedException e) {         }     } }   private static void printProgress(long startTime, long total, long current) {     long eta = current == 0 ? 0 :          (total - current) * (System.currentTimeMillis() - startTime) / current;      String etaHms = current == 0 ? "N/A" :              String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(eta),                     TimeUnit.MILLISECONDS.toMinutes(eta) % TimeUnit.HOURS.toMinutes(1),                     TimeUnit.MILLISECONDS.toSeconds(eta) % TimeUnit.MINUTES.toSeconds(1));      StringBuilder string = new StringBuilder(140);        int percent = (int) (current * 100 / total);     string         .append('\r')         .append(String.join("", Collections.nCopies(percent == 0 ? 2 : 2 - (int) (Math.log10(percent)), " ")))         .append(String.format(" %d%% [", percent))         .append(String.join("", Collections.nCopies(percent, "=")))         .append('>')         .append(String.join("", Collections.nCopies(100 - percent, " ")))         .append(']')         .append(String.join("", Collections.nCopies((int) (Math.log10(total)) - (int) (Math.log10(current)), " ")))         .append(String.format(" %d/%d, ETA: %s", current, total, etaHms));      System.out.print(string); } 

The result: enter image description here

like image 80
Mike Shauneu Avatar answered Oct 02 '22 01:10

Mike Shauneu