Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


10.1

Elementare Ein- und Ausgabe


Zuerst wird die elementare Ein- und Ausgabe einer Applikation behandelt. Applikationen sind Stand-alone-Programme. Wie Programme in Pascal oder C auch können sie auf die Standardein- und -ausgabe zugreifen. Bei Applikationen ist die Standardein- und ausgabe mit der Konsole verbunden, von der die Applikation gestartet wurde.

Bei Applets verhält sich dies etwas anders. Ein Applet, das im Appletviewer betrachtet wird, ist über diesen mit der Konsole verbunden, sofern der Appletviewer von der Konsole aus gestartet wurde. Im Gegensatz hierzu verknüpft der Netscape-Navigator (Communicator) die Standardausgabe mit seiner »Java Console«. Die »Java Console« dient aber nur dem Anzeigen von Text. Somit kann ein Applet, das in einem Browser läuft, nichts von der Standardeingabe lesen. Der MS Internet-Explorer leitet die Standardausgabe seiner Applets in eine Textdatei um. Diese Datei hat den Namen javalog.txt und befindet sich im Windows-Installationsverzeichnis im Ordner java. Bei Windows-NT könnte diese Datei z. B. unter dem Pfad
  c:\winnt\java\javalog.txt
zu finden sein. Die Ausgabe von Text auf die Standardausgabe wird bei Applets häufig zu Debugging-Zwecken eingesetzt. Die »Java Console« befindet sich beim Netscape-Navigator bis einschließlich Version 3 unter »Optionen¦Java Console«. Beim Netscape Communicator 4.0x erfolgt der Aufruf unter dem Menü »Communicator¦Java Console«. Der Netscape Communicator 4.5 hat den entsprechenden Aufruf unter »Communicator¦Tools¦Java Console«.

Die Standardausgabe wurde schon im vorigen Kapitel ohne weitere Erklärung benutzt. Auf jeden dieser Standardstreams kann durch jeweils eine Variable zugegriffen werden, die in der Klasse java.lang.System definiert ist. Diese ist, wie alle Klassen des Pakets java.lang, standardmäßig bei jedem Applet bzw. jeder Applikation eingebunden und muss nicht explizit importiert werden.

Tabelle 10.1: Die Standardstreams in Java
System.inStandardeingabe
System.outStandardausgabe
System.errStandardfehlerausgabe

Folgendes Beispiel liest einen Text von der Standardeingabe ein und gibt ihn anschließend auf der Standardausgabe wieder aus. Die einzelnen Eingaben müssen alle mit Return abgeschlossen werden. Enthält eine Zeile nur das Wort exit, wird das Programm an dieser Stelle verlassen. Tritt ein Fehler bei der Eingabe auf, so wird eine Fehlermeldung auf System.err ausgegeben:

  package de.dpunkt.streams.standard;
  
  import java.io.IOException;
  
  public class StreamDemo {
  
    public static void main(String args[]) {
      byte buffer[] = new byte[80];  // Zeichenpuffer
      String input = "";
      int read;
      do {
        try {
          // Einlesen der Zeichen
          read = System.in.read(buffer, 0, 80);
          // Umwandeln des Pufferinhaltes in einen String
          input = new String(buffer, 0, read);
          // Ausgabe der eingelesenen Zeichen
          System.out.print(input);
        }
        catch(IOException e) {
          e.printStackTrace();
        }
      } while(! input.equals("exit"+System.getProperty("line.separator")));
      System.out.println(
            "Thank you very much for using this program");
    }
  
  }
Der Eingabe-Stream System.in ist ein Exemplar der Klasse InputStream und besitzt somit auch deren Methoden. Die Eingabe wird in diesem Fall mit der Methode read() vorgenommen. Hierdurch wird das Array buffer mit den vom Benutzer auf der Standardeingabe eingegebenen Zeichen Byte-weise gefüllt:
  read = System.in.read(buffer, 0, 80);
Als weitere Parameter bekommt diese Methode den Offset in das Array und die Anzahl der maximal zu lesenden Bytes übergeben. Mit Offset ist die Position innerhalb des Arrays gemeint, ab dem in das Array geschrieben werden soll.

Als Ergebnis liefert read() die Anzahl der tatsächlich gelesenen Bytes. Die Eingabe muss allerdings zuvor mit Return abgeschlossen worden sein. Danach wird der Inhalt des Eingabepuffers buffer in einen String umgewandelt:
  input = new String(buffer, 0, read);
Das Gegenstück zum Eingabe-Stream wird ebenfalls von einer bestimmten Klasse repräsentiert: dem OutputStream.

System.out und System.err sind beides Exemplare des von OutputStream abgeleiteten PrintStream.

Die Ausgabe wird bei System.out mit der Methode print() vorgenommen. In diesem Beispiel wird mit print() der zuvor eingelesene String ausgegeben.

println() ist eine andere wichtige Methode von PrintStream. Für sie gilt dasselbe, was gerade für print() gesagt wurde, mit dem Unterschied, dass bei der Verwendung von println() der Ausgabe zusätzlich ein Newline-Zeichen angehängt wird.

Wie man beim Testen des obigen Programmes feststellen kann, wird bei der Ausgabe des Textes ebenfalls eine neue Zeile begonnen, obwohl nicht println() verwendet wird. Das liegt daran, dass read() auch das Newline-Zeichen, das beim Abschluss der Eingabe durch Druck von Return erzeugt wird, einliest. Beim anschließenden Aufruf von print() wird auch dieses Zeichen ausgegeben und somit zur nächsten Zeile gesprungen.

print() und println() sind in der Klasse PrintStream mehrfach vertreten, jeweils mit anderen Datentypen als Parametern, so dass es für alle Standarddatentypen eine eigene println() bzw. print()-Methode gibt. Der Wert, der print() bzw. println() übergeben bekommt, wird hierzu jeweils automatisch in einen String umgewandelt, der anschließend ausgegeben wird.

Es[1.1] ist möglich, die in diesem Abschnitt vorgestellten Standard-Streams umzuleiten. Hierzu werden in der Klasse java.lang.System die drei statischen Methoden setIn(), setOut() und setErr() definiert. Jede der drei Methoden bekommt jeweils einen Stream als Parameter übergeben, mit dem der jeweilige Standard-Stream verknüpft wird. So würden z. B. die Zeilen
 FileOutputStream out = new FileOutputStream("error.log");
 System.setErr(out);
den Standard-Error-Stream in die Datei error.log umleiten. (Der Umgang mit Dateien wird im Abschnitt 10.5 genauer erläutert). Das Umleiten der Standard-Streams kann z. B. zu Debugging-Zwecken verwendet werden. Im Debug-Modus werden sämtliche Fehlermeldungen über System.err auf die Standardfehlerausgabe gedruckt. Im Laufzeitmodus werden die Fehler in eine Datei umgeleitet. Das Umleiten der Ausgabe ist besonders dann wichtig, wenn keine Konsole zur Ausgabe zur Verfügung steht, wie z. B. bei Server-Applikationen, die im Hintergrund ablaufen (z. B. ein NT-Dienst).

Die Klasse InputStream und OutputStream sind die Grundobjekte zur Ein- und Ausgabe über Streams. Die Methoden, die diese Klassen besitzen, sind jedoch wenig komfortabel.

Das Paket java.io besitzt deshalb noch weitere Streams, die dem Programmierer auf vielfältige Art die Abwicklung der Ein- und Ausgabe erleichtern. Ihnen sind die folgenden Abschnitte gewidmet.

Alle Streams besitzen gewisse Gemeinsamkeiten, d. h. Methoden, die jedem Stream zur Verfügung stehen.

Bei InputStream sind dies:
available()Liefert die Anzahl an Bytes, die aus dem Stream gelesen werden können, ohne den Lesevorgang zu blockieren. Versucht man mehr Bytes aus dem Stream zu lesen, blockiert der Lesevorgang den weiteren Programmablauf so lange, bis alle Bytes eingelesen sind.
skip(long n)Überliest n Bytes.
Die gemeinsame Methode aller OutputStreams ist
flush()Bei Aufruf dieser Methode werden alle Zeichen, die sich noch im Stream befinden, herausgeschrieben.
Sowohl alle InputStreams, als auch alle OutputStreams besitzen die Methode
close()Hiermit wird ein Stream geschlossen. close() sollte immer aufgerufen werden, wenn der Stream nicht mehr gebraucht wird.


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.