2013-01-22 15 views
5

Napisałem program w języku Java, który ładuje dane z pliku i wyświetlam postęp ładowania w wierszu poleceń, drukując komunikat na ekranie po każdym n rekordach, które wyglądają tak:Wyświetlacz java zmieniający postęp w linii poleceń

$> Przetworzono 100 rekordów.

$> Przetworzono 200 rekordów.

$> Przetworzono 300 rekordów.

$> Przetworzono 400 rekordów.

$> Przetworzono 500 rekordów.

...

Jednak chciałbym po prostu wydrukować jedną linię, a tylko aktualizuje liczbę, czyli tak, że wyjście zawsze tak wygląda następująco:

$> przetworzone < n> rekordy.

Jak to zrobić w Javie i czy jest to możliwe?

+0

Możliwy duplikat: http://stackoverflow.com/questions/1001335/java-gotoxyx-y-for-console-applications – Andremoniy

Odpowiedz

5

To zależy od konsoli, ale najprostszym sposobem jest użycie znaku Backspace, aby przesunąć kursor do tyłu, z przodu niedawno drukowanymi literami:

int[] step = {100,200,300,400,500}; 
System.out.print("$> processed < "); 
for (int i : step) { 
    System.out.print(i + " > records.\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); 
    Thread.sleep(500); 
} 

Działa to w wierszu poleceń systemu Windows, ale na przykład nie działa na konsoli Eclipse.

Powinieneś dodać dodatkową logikę, aby policzyć liczby drukowanych znaków, a nie zakodować ich wszystkich "\ b", ale obliczyć prawidłową liczbę w zależności od ostatnich wyników.

Jak sugeruje @Reza, używając „\ r” jest jeszcze łatwiejsze:

int[] step = {100,200,300,400,500}; 
for (int i : step) { 
    System.out.print("$> processed < " + i + " > records.\r"); 
    Thread.sleep(500); 
} 

Robi nadal nie działa na konsoli Eclipse (ale jest bardziej czytelny niż podejście Backspace), ale unika się manipulacji wszystkie znaki backspace. Jeśli drukujesz krótszą linię niż poprzednio, może być konieczne wydrukowanie dodatkowych spacji, aby usunąć znaki końcowe.

+1

Andreas - Mam do drukowania Terminal na moim Ubuntu i działa jak urok. Dziękuję Ci. – AHL

+0

BTW: Link, który napisał @Reza sugeruje użycie "\ r", aby przejść do początku linii, co może być jeszcze łatwiejsze - wystarczy wtedy ponownie wydrukować całą linię. –

+0

Kod sekund działa jak czar – Mohsen

1

Musisz znaleźć sposób na powrót do początku linii i nadpisanie tego, co już zostało wypisane na konsoli. Ta kwestia została poruszona tutaj:

How can I return to the start of a line in a console?

+0

Próbowałem podejścia, do którego się odnosisz, i to też działa. Czy mogę oznaczyć dwa pytania jako prawidłowe? Jeśli zaznaczę tę odpowiedź, powyższy zostanie odznaczony. – AHL

+0

@AHL O ile mi wiadomo, tylko jedna odpowiedź może być "zaakceptowana". Zobacz tutaj: [http://meta.stackexchange.com/questions/40200/can-i-accept-two-answers](http://meta.stackexchange.com/questions/40200/can-i-accept-two-answers) – RGO