s11 – Kommunikation mit dem User (Ein- und Ausgabe)

 

Ausgabe von Text in der Konsole

Bisher können unsere Programme zwar Dinge tun, zum Beispiel aus übergebenen Parametern ein Ergebnis berechnen, aber das Ergebnis wird dem Nutzer des Programmes nicht mitgeteilt.
Wir wollen nun eine Funktion einführen, mit der Text in der Konsole ausgegeben werden kann.
Die Funktion ist:

print([String]);

Natürlich könnte man die print-Funktion selber programmieren, aber es gibt sie auch schon fertig in der Standardbibliothek von Java.
Sie ist eine Funktion des Objektes out, welches wiederum zu der Klasse System gehört.

Um einen Text auszugeben, schreibt man daher in Java:

System.out.print("hallo ");
System.out.print("welt");

Es erscheint “hallo welt” in der Konsole. Hier wird schon ein Problem der print Methode deutlich: Alles wird in die gleiche Zeile geschrieben. Möchte man eine neue Zeile anfangen, muss man daher ein “\n” in den String einfügen:

System.out.print("hallo \n welt");

führt zu der Ausgabe
hallo
welt

Wenn man sich das \n sparen möchte, kann man statt print() die Methode println benutzen. Die beiden folgenden Befehle führen zu der gleichen Ausgabe:

print("asd \n");

println("asd ");

Mit print und println können auch Inhalte von Variablen ausgegeben werden:

int i1 = 5;
String s1 = "asd";
System.out.print(i1);
System.out.print(s1):

Ausgabe: “5asd”

Die Kombination von verschiedenen Teilen in der Methode print erfolgt mit +.

int i1 = 5;
String s1 = "asd";
System.out.print(i1+" "+s1);

Ausgabe: “5 asd”

Dies ist nicht zu verwechseln mit mathematischen Operationen, denn auch diese können innerhalb der print-Methode durchgeführt werden:

System.out.print(17+23);

führt nicht zur Ausgabe “17+23″ oder “1723″, sondern zu “40″.

Beispiel:
Ausgabe der Zahlen von 0 bis 9 in je einer eigenen Zeile

for (int i = 0; i < 10; ++ i)
	System.out.println(i);

Eingabe von Text in der Konsole

Es gibt kaum ein Programm, das mit festen Werten rechnet. Normalerweise werden Werte vom Benutzer entgegengenommen.
In Java kann dies wie folgt umgesetzt werden:

System.out.println("Texteingabe mit Hilfe von System.in");
String s;
try
{
	BufferedReader brdEingabe
		= new BufferedReader(new InputStreamReader(System.in));
	System.out.print("Text eingeben: ");
	s = brdEingabe.readLine();
	System.out.println("Sie haben eingegeben: "+s);
}
catch (IOException e)
{
	System.out.println("Fehler bei der Ein- oder Ausgabe: "+e);
}

Eine andere Möglichkeit ist es, einen sogenannten Scanner zu benutzen, der Tastatureingaben abscannt:

import java.util.Scanner; 	// Scanner für die Eingabe von Werten

public class ScannerTest
{
	public static void main(String[] args)
	{
		// Variablen Deklaration
		double x1, y1, x2, y2;
		Scanner scnEingabe = new Scanner(System.in);

		// Variablen Initialisierung
		System.out.println("Bitte Koordinaten von P1(x1, y1) und P2 eingeben");
		System.out.print("x1 = ");
		x1 = scnEingabe.nextDouble();
		// Weitere Eingaben und Verarbeitung
	}
}

Ausgabe von Text in eine Textdatei

Um eine Textdatei zu schreiben, gibt es verschiedene Möglichkeiten. Die gebräuchlichste ist es, einen PrintWriter zu benutzen. Im Konstruktor initialisiert man diesen als FileWriter und übergibt ihm dann die zu speichernden Textzeilen. Bei der close() Anweisung wird die Textdatei gespeichert und geschlossen:

System.out.println("Text in Textdatei schreiben");
try
{
	PrintWriter pwtAusgabe = new PrintWriter(new FileWriter ("text.txt"), true);
	pwtAusgabe.println("Erste Zeile");
	pwtAusgabe.println("Zweite Zeile und \n Dritte Zeile");
	pwtAusgabe.close();
}
catch (IOException e)
{
	System.out.println("Fehler bei der Ein- oder Ausgabe: "+e);
}

Die andere Möglichkeit ist es, einen PrintStream zu nutzen:

try
{
	File fleDatei;
	String sDateiname = "data.txt";
	fleDatei = new File(sDateiname);
	PrintStream pstAusgabe = new PrintStream(fleDatei);
	pstAusgabe.println("asd");
	pstAusgabe.println("qwe");
}
catch (FileNotFoundException e)
{
	System.out.println("Datei konnte nich geschrieben werden");
}

Einlesen von Textdateien

Auch hier seien wieder zwei Alternativen genannt. Die erste Möglichkeit ist ein BufferedReader:

System.out.println("Text aus Textdatei lesen");
String sZeile;
try
{
	BufferedReader brdEingabe = new BufferedReader(new FileReader("text.txt"));
	while ((sZeile = brdEingabe.readLine()) != null)
	{
		// sZeile benutzen
		System.out.println(sZeile);
	}
	brdEingabe.close();
}
catch (IOException e)
{
	System.out.println("Fehler bei der Ein- oder Ausgabe: "+e);
}

Die zweite Möglichkeit ein Scanner Objekt (wie schon bei der Eingabe per Tastatur):

try
{
	Vector<Integer> iZahlen;
	File fleDatei = new File("data.txt");
	Scanner scnEingabe = new Scanner(fleDatei);
	while (scnEingabe.hasNextInt())
		iZahlen.add(scnEingabe.nextInt());
}
catch (IOException e)
{
	System.out.println("Fehler bei der Ein- oder Ausgabe: "+e);
}