Weiss jemand wie man eine ausgegebene Zeile (System.out.print oder System.out.println) auf der gleichen Zeile wieder mit Text ersetzt?
Praktisch alles was man dazu im Netz findet, ist schlicht Blödsinn: “\r” macht mir jeweils eine neue Zeile, und “\b” gibt mir ein komisches, nicht lesbares Zeichen raus?
Ich möchte den Fortschritt eines Downloads auf einer Zeile mit 0-100% haben!
wohin die Ausgabe erfolgt ist natürlich von enormer Bedeutung,
eine System-Konsole welchen Betriebssystems oder ein Output-Fenster einer bestimmten IDE mit eigenen Regeln?
zum Fall Eclipse, einfach mal immer als Standard angenommen, ‘komisches, nicht lesbares Zeichen’ passt, vielleicht bekannt, aber eben auch nicht durch Magie zu überwinden:
dort findest du alles zum Einstieg in Dein Problem. Wenn Du sciher stellen kannst, das Dein Programm immer in Eclipse ausgeführt wird, dann ist alles in Ordnung. Ansonsten darfst Du Dich schlau mache wo Dein Programm läuft und es für die entsprechende Konsole machen. Unter Windows gibt es da sicher schon Unterschiede zwischen XP/7/8/8.1/10
@vfl_freak: Kannst mal im JF suchen, ich habe da mal vor langer Zeit eine Lösung mit dem dem von SlaterB herausgesuchten Sonderzeichen \b angeboten.
Je Aufruf löschst du damit ein Zeichen in der Zeile.
Im Prinzip in etwa so:
public class Test {
public static void main(String[] args) {
System.out.print("ABCDEFG");
System.out.print("\b");
System.out.print("Z");
System.out.print("\r");
System.out.print("!");
}
}
Wnen man die Länge des Strings ermittelt, kann man in einer Schleife die Zeile löschen. \b erzeugt einen Backspace, \r springt an den Anfang des Strings bzw. der Zeile.
Habs mal rausgesucht:
import java.io.*;
import java.text.*;
import java.util.*;
public class ConsolenUhr {
public static void main(String[] args) {
ConsolenUhr cb = new ConsolenUhr();
}
public ConsolenUhr() {
new ZeitAusgabe().start();
new Eingabe().start();
}
class Eingabe extends Thread {
BufferedReader br;
public Eingabe() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public void run() {
char c = 0;
while(c != 'q') { //Exit mit Tastendruck auf "q"
try {
c = (char)br.read();
}
catch(IOException e) {
System.out.println("Fehler beim Lesen von der Tastatur!");
}
}
System.exit(0);
}
}
//Eine Uhr, die auf einer Zeile in der Konsole läuft
class ZeitAusgabe extends Thread {
DateFormat df = new SimpleDateFormat("HH:mm:ss");
public void run() {
String zeit = null;
while(true) {
zeit = df.format(new Date());
System.out.print(zeit);
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
System.out.println("Fehler während CPU-Freigabe");
}
for(int i = 0, j = zeit.length();i < j; i++) {
System.out.print("\b"); //Zeichen löschen
}
}
}
}
}
Danke für die Feedback und sorry für meine etwas verspätete Antwort, das Thema ist ein wenig in den Hintergrund geraten… ja, ich verwende Eclipse. Was dort drin geschieht, ist allerdings weniger wichtig. Natürlich wäre es schön, wenn sich das Konsolenprogramm überall gleich verhalten würde.