Umgang mit System.out.println() und .print()

jibblejava

Mitglied
Hallo Forenfreunde,

Bei der Nutzung der println() und print() Methode ist mir Folgendes aufgefallen, dessen Hintergrund ich gerne näher verstehen möchte:

Für das bessere Verständnis zwei Beispiele:

Java:
import Prog1Tools.IOTools;

public class TestForum
{
	public static void main (String[] args)
	{
		for (int i = 0; i < 3; i++)
		{
			System.out.print(i);
		}
		System.out.println();
	}
}

Als Ausgabe bekomme ich nun: 012

Das 2. Beispiel:

Java:
import Prog1Tools.IOTools;

public class TestForum
{
	public static void main (String[] args)
	{
		for (int i = 0; i < 3; i++)
		{
			char b = IOTools.readChar("Enter Char");
			System.out.print(b);
		}
		System.out.println();
	}
}

erhalte ich bei einer Eingabe von a, dann b, dann c

"Programm wird ausgeführt ...
Enter Chara
aEnter Charb
bEnter Charc
c

Programm beendet"

Kann mir jemand genauer erläutern, welche Logik im zweiten Beispiel hinter dem ausgegebenen Ergebnis steht?

Meine bisherige Erfahrung mit println() und print() ist folgende:

wird print() in einer Schleife verwendet, verhält es sich wie ein "stummer Zeichensammler". Da die Methode keinen Zeilenvorschub vorsieht, reiht sie im Laufe der Schleifendurchgänge die auszugebenden Zeichen aneinander.
Mit println() können alle Zeichen nach erreichen der Abbruchbedingung in einer Zeile stehend hintereinander abgebildet werden.

Im Beispiel zwei ist das nicht der Fall. Dort heftet sich das Zeichen an die nachfolgende Zeichenkette an und scheint nicht mit der println()-Methode verknüpft zu sein.

Das anzustrebende Resultat meinerseits ist, auch mit einer Zeicheneingabe in der Schleife nur eine Ausgabe aller eingebenen Zeichen nach dem Abschluss der Schleife anzeigen zu lassen.


Ich bin euch für jede Hilfe und/oder Hinweis dankbar!
 
Die IOTools scheinen von dir programmiert zu sein, am besten solltest du den Code von der readChar() Methode dann auch noch posten, denn ganz offensichtlich willst du ja wissen warum sie eine bestimmte (und zugegebenermaßen seltsame) Ausgabe erzeugt.
 
Zunächst mal:
print schließt die Ausgabe nicht mit einem Zeilenumbruch ab, println schon.

Was passiert jetzt?
Dein Programm schreibt "Enter char" (ohne Zeilenumbruch) auf den Bildschirm. Du tippst "a" + Return, was bei der Eingabe auch auf dem Bildschirm wiedergegeben wird. Durch das Return landest du jetzt in der nächsten Bildschirmzeile. Das "a" wird von deiner Print-Anweisung ausgeben, allerdings ohne einen Zeilenumbruch d.h. du bleibst in der gleichen Bildschirmzeile stehen. Jetzt schreibt dein Programm erneut "Enter char" in die gleiche Zeile, in der bereits das "a" steht und fordert wieder zur Eingabe auf. Letztendlich beginn damit das Spielchen wieder von vorne.

Zum Thema "stummer Zeichensammler" und andere, ähm seltsame Thesen:
System.out arbeitet folgendermaßen:

Alle Ausgaben werden gepuffert, bis zum Zeilenumbruch. Dann erfolgt die Ausgabe.

Interessant ist in diesem Zusammenhang, dass bei System.err keine Pufferung erfolgt, sondern hier die (Fehler-)ausgabe sofort erfolgt.
 
Zuletzt bearbeitet:
Vielen Dank für die Antwort.

Die IOTools beziehe ich als Blackbox aus Editing Java Easily. Nach erster Suche habe ich auch leider keine Möglichkeit gefunden, die Programmcodes der verschiedenen IOTools Methoden anzeigen zu lassen.
 
@fischefr:

Die Information über den Zusammenhang von System.out und dem Puffer erklärt auch den "stummen Zeilensammler", vielen Dank für diesen Hinweis.
Durch den Zeilenumbruch der println()-Methode wird der Puffer entleert und angezeigt.

Interessant ist jetzt vor allem, mit welcher Möglichkeit ich im Falle des zweiten Beispiels alle Zeichen, eingegeben über die Konsole, wieder gebündelt ausgeben kann, sobald meine Schleife bis zur Abbruchbedingung durchlaufen wurde.

Hinweise und Tipps zur Lösung dieses Problems nehme ich dankend an.
 
Zuletzt bearbeitet:
Java:
import Prog1Tools.IOTools;
 
public class TestForum
{
public static void main (String[] args)
{
eingabe = ""
for (int i = 0; i < 3; i++)
{
char b = IOTools.readChar("Enter Char");
eingabe += b
}
System.out.println(eingabe);
}
}

Meinst du so etwas? Ist übrigens ungetestet, also ohne Gewähr! Die Einrückungen haben übrigens die Kollegen copy und paste auf dem Gewissen 😳
 
Zuletzt bearbeitet:
Super, vielen Dank!
Der Code ist ausführbar und liefert das gesuchte Ergebnis.
Die eingegebenen Zeichen werden in der Instanzvariable eingabe iterativ mit jedem Schleifendurchlauf gespeichert.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben