2011-10-29 21 views
50

Voglio stampare una barra di avanzamento in questo modo:Come posso stampare sulla stessa linea?

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

Ma queste dovrebbero essere tutti stampati alla stessa linea nel terminale al posto di uno nuovo. Ciò che intendo è che ogni nuova riga deve sostituire la precedente, non si tratta di utilizzare print() anziché println().

Come posso farlo in Java?

risposta

72

formato stringa in questo modo:

[#     ] 1%\r 

Nota il carattere \r. È il cosiddetto ritorno a capo che riporta il cursore all'inizio della riga.

Infine, assicurarsi di utilizzare

System.out.print() 

e non

System.out.println() 
+13

La sequenza di ritorno del carriage carriage '\ r' non funziona in Eclipse a causa di un [vecchio bug] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=76936) riportato nel 2004 e non risolto ancora nell'ultima versione di Eclipse (4.3.2 Kepler) –

+0

Quindi funziona solo per una linea? –

+0

@Sortofabeginner: In una parola, sì. – NPE

2

È possibile stampare il carattere di backspace '\ b' tante volte quanto necessario per eliminare la riga prima di stampare la barra di avanzamento aggiornata.

+2

non elimina la linea prima, semplicemente sposta il cursore indietro di un carattere. – Amndeep7

13

In Linux, c'è diverse sequenze di escape per terminale di controllo. Ad esempio, esiste una sequenza di escape speciale per cancellare l'intera riga: \33[2K e per spostare il cursore sulla riga precedente: \33[1A. Quindi tutto ciò che serve è stampare questo ogni volta che è necessario aggiornare la linea. Ecco il codice che stampa 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)"); 

ci sono i codici per la navigazione del cursore, schermo di compensazione e così via.

Penso che ci siano alcune librerie che ci aiutano (ncurses?).

+2

Ho scritto un paio di classi di utilità per automatizzare questa attività per te; includono anche la colorazione dell'output: http://bitbucket.org/dainkaplan/tempura-utils –

10

In primo luogo, mi piacerebbe scusarmi per aver riportato questa domanda, ma ho sentito che avrebbe potuto usare un'altra risposta.

Derek Schultz è un tipo corretto. Il carattere '\ b' sposta il cursore di stampa indietro di un carattere, permettendoti di sovrascrivere il carattere che è stato stampato lì (non cancella l'intera riga o il carattere che era lì a meno che non stampi nuove informazioni in alto). Quello che segue è un esempio di una barra di avanzamento che utilizza Java anche se non segue il tuo formato, mostra come risolvere il problema principale della sovrascrittura dei caratteri (questo è stato testato solo in Ubuntu 12.04 con Oracle 7 su una macchina a 32 bit, ma dovrebbe funzionare su tutti i sistemi 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(); 
    } 
} 
0
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(); 
    } 
} 
Problemi correlati