Ausgegebene Zeile (System.out.print oder System.out.println) auf der gleichen Zeile ersetzen?


#1

Hallo zusammen

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!


#2

Moin,

Du willst in der Konsole einen ausgegeben Text durch einen neuen/anderen ersetzen??
Wüsste ich so nicht, außer in dem du die gesamte Konsole löscht!

VG Klaus


#3

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:

Eclipe-Bug:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=76936
‘Unbelievable one bug is not fixed after 14 years…’
[ohne Bewertung ob das nun überhaupt ein Bug ist oder Anspruch auf Behebung besteht]


#4

jetzt wirds lustig …

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

(ick werde alt…)


#5

@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
            }
         }
      }
   }
}

#6

Das mit dem \b funktioniert aber eben nur in der “echten” Windows-Eingabeaufforderung oder dem Linux Bash.

In Eclipse zeigt er für das \b eben eins dieser “Ich-Kann-Dieses-Zeichen-Nicht-Anzeigen”-Platzhalterhkästchen an…


#8

Moin L-ectron-X,

ok, ich habe diese drei Beiträge (über Deinen Nick und ‘Backspace’) gefunden:
Konsole aktualisieren
Falscheingaben abfangen
Wofür steht \r ?

Ist der von Dir gesuchte dabei??
VG Klaus


#9

Ja. Ist im ersten Link weiter verlinkt. Habe ich bereits oben eingebaut.


#10

ah, ok - hatte es jetzt nicht verglichen!
VG Klaus


#11

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.

Werde es mal mir euren Tipps versuchen!