2011-01-01 17 views
23

Chciałbym dodać wskaźnik postępu do programu Java w wierszu poleceń.Java: Aktualizowanie tekstu w wierszu polecenia bez nowej linii

Na przykład, jeśli używam wget, to pokazuje:

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

Czy to możliwe, aby wskaźnik postępu, że aktualizacje bez dodawania nowej linii do dna?

Dzięki.

+0

@rfeak Niestety, http://stackoverflow.com/questions/1001290/console-based-progress-in-java – TheLQ

Odpowiedz

27

Najpierw, gdy piszesz, nie używaj writeln(). Użyj write(). Po drugie, możesz użyć "\ r" do zwrotu karetki bez użycia \ n, który jest linią nową. Zwrot karetki powinien przywrócić cię na początku linii.

+7

Ale jeśli długość tekstu może się zmniejszyć (na przykład liczba cyfr potrzebna do wyświetlenia spadku ETA), pamiętaj, aby pisać spacje po starych znakach, aby się nie wyświetlały. EDYCJA: Dodatkowo, pamiętaj o wykonaniu System.out.flush(), aby upewnić się, że tekst rzeczywiście się wyświetla (np. Na terminalu buforowanym linią). – jstanley

+0

@jstanley - Dobre punkty do zapamiętania. – rfeak

23

używam następujący kod:

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); 
} 

Rezultat: enter image description here

Powiązane problemy