Die Ausgabe-Streams vom Typ java.io.PrintStream sind in der BS2000-Portierung standardmäßig nicht modifiziert, werden aber hier erwähnt, weil sie besondere Schwierigkeiten verursachen können.
Methoden der Klasse java.io.PrintStream
Entsprechend der Java-Spezifikation konvertieren einige Methoden der Klasse java.io.PrintStream ihre Ausgaben in den Standard-Codeset (Wert der System-Property file.encoding), andere aber nicht. Mit dieser Klasse ist es deshalb besonders leicht, Programme zu schreiben, die in einer ASCII-Welt scheinbar funktionieren, aber im BS2000 nicht das erwartete Ergebnis liefern. Das folgende einfache Beispiel soll das verdeutlichen:
Beispiel
... PrintStream out = new PrintStream(new FileOutputStream("test")); ... out.print("Das ist ein Text."); out.write('\n'); ...
In einem ASCII-basierten System wird der Inhalt der Datei test anschließend eine mit Newline abgeschlossene Zeile mit obigem Text sein. Im BS2000 wäre zwar der Text in EBCDIC-Codierung in der Datei zu finden, die Zeile wäre aber nicht mit Newline abgeschlossen, sondern würde als letztes Zeichen ein Schmierzeichen enthalten.
Das zeigt anschaulich, wie wichtig es ist, bei der Neuimplementierung von Java-Code für die Ein-/Ausgabe von Text die neuen Reader- und Writer-Klassen (also InputStreamReader und OutputStreamWriter) zu verwenden.
Im BS2000 steht ein zusätzlicher Schalter bereit, der das Verhalten von PrintStream derart ändert, dass keine Methode mehr eine Konvertierung vornimmt. Dies kann beim Aufruf von Java über -Djava.localized.print=False erreicht werden. Mit dieser Einstellung verhält sich die Klasse PrintStream nicht mehr spezifikationsgemäß, dies kann aber für existierende Anwendungen trotzdem nützlich sein.
Der Vollständigkeit halber sei nochmals erwähnt, dass die Verwendung von „Localized Streams“ als Basis für PrintStreams oder die „Lokalisierung“ eines PrintStreams nicht zu Mehrfach-Konvertierungen führt. Für derartig behandelte PrintStreams gilt dann aber natürlich, dass alle Methoden konvertieren.
Zusammenwirken der Methoden readLine() und println()
Häufig wird angenommen, dass mit println() auf einen PrintStream geschriebene Daten durch die readLine() Methoden einiger InputStream-Klassen wieder gelesen werden könnten. Im BS2000 führt diese Annahme zu einem Fehler, da bei der Ausgabe auf einen PrintStream eine Konvertierung in den Native Codeset (im BS2000 OSD_EBCDIC_DF04_1) vorgenommen wird, aber keine der readLine() Methoden der InputStream-Klassen beim Lesen gleiches tut. Verwenden Sie hier als Ersatz die neuen Reader- und Writer-Klassen oder verwenden Sie ebenfalls „Localized Streams“ bei der Eingabe.