Come posso stampare sulla stessa riga?

Voglio stampare una barra di avanzamento in questo modo:

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

Ma dovrebbero essere tutti stampati sulla stessa riga del terminale anziché su uno nuovo. Quello che intendo è che ogni nuova riga dovrebbe sostituire il precedente, non si tratta di usare print() invece di println() .

Come posso farlo in Java?

Formatta la tua stringa in questo modo:

 [# ] 1%\r 

Nota il carattere \r . È il cosiddetto ritorno a capo che sposta il cursore indietro all’inizio della riga.

Infine, assicurati di usarlo

 System.out.print() 

e non

 System.out.println() 

In Linux, ci sono diverse sequenze di escape per il 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 la 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)"); 

Esistono codici per la navigazione del cursore, la schermata di cancellazione e così via.

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

Per prima cosa, mi piacerebbe scusarmi per aver riportato questa domanda, ma ho sentito che avrebbe potuto usare un’altra risposta.

Derek Schultz è abbastanza 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(); } } 

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

 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++