Die Klasse java.lang.System stellt drei Standard Streams in, out und err zur Verfügung. Analog zur Lösung im OS/390 sind diese Standard Streams in JENV „Localized Streams“. Damit ist im BS2000 eine normale Text- Ein-/Ausgabe über diese Streams möglich.
Dies kann selektiv für jeden der drei Ströme eingestellt werden, indem beim Programmstart die folgenden System-Properties versorgt werden:
System.in -Djava.localized.in=... System.out -Djava.localized.out=... System.err -Djava.localized.err=...
Die Ströme werden nicht modifiziert, wenn die Erweiterung für „Localized Streams“ abgeschaltet ist (-Djava.localized.streams=False). Ein späteres Setzen oder Ändern dieser System-Properties bleibt für die aktuell eingestellten Standard-Ströme ebenfalls wirkungslos.
Folgende Werte können angegeben werden:
Default |
|
Full | Sowohl die Original-Ströme, als auch die später mit setIn() usw. gesetzten Standardströme werden lokalisiert. |
None |
|
Soll eine Anwendung die Methoden setIn(), setOut() oder setErr() benutzen, um eigene Streams zuzuweisen, so gibt es zwei Möglichkeiten für einen korrekten Ablauf: Entweder es wird dafür gesorgt, dass die Standard-Streams immer „Localized Streams“ (also Text-Streams) sind, oder es wird bei der Verwendung der Standard-Streams auf eine saubere Unterscheidung zwischen Text- und Binär-Ein-/Ausgabe geachtet. Das folgende Beispiel zeigt die Anwendung beider Möglichkeiten.
Die zweite Lösung ist dabei die bessere. So sollte grundsätzlich mit den Standard-Streams gearbeitet werden. Die erste Lösung kann aber notwendig sein, wenn mit bereits existierenden Java-Klassen gearbeitet werden muss, die nicht portabel implementiert wurden.
Beispiel
Der folgende Code (den man ähnlich unter den Demo-Programmen von JavaSoft finden kann) würde zu einer binären Ein-/Ausgabe über diese Ströme führen und damit zu unlesbaren Ausgabedateien oder einer möglichen Fehlinterpretationen der Eingabe, falls eigentlich Text Ein-/Ausgabe gemeint war.
... public static String read_write() { StringBuffer buf = new StringBuffer(80); int c; try { while ((c = System.in.read()) != -1) { char ch = (char) c; System.out.write(c); if (ch == '\n') break; buf.append(ch); } catch (IOException e) { System.err.println(e); } return (buf.toString()); } ... System.setIn(new FileInputStream("myinputfile")); System.setOut(new PrintStream(new FileOutputStream("myoutputfile"))); ... line = read_write(); ...
Das folgende Programm-Fragment zeigt die erste Lösung: die Standard-Streams sind immer „Localized Streams“ (also Text-Streams). Diese Lösung wäre vom Aufrufer zu realisieren.
... System.setIn(com.fujitsu.ts.java.io.LocalizedInputStream. localize (new FileInputStream("myinputfile"))); System.setOut(com.fujitsu.ts.java.io.LocalizedPrintStream. localize (new FileOutputStream("myoutputfile"))); ... line = read_write(); ...
Das Programm-Fragment der zweiten Lösung könnte so aussehen und wäre vom Nutzer der Standard-Streams zu implementieren: bei der Verwendung der Standard-Streams wird auf eine saubere Unterscheidung zwischen Text- und Binär-Ein-/Ausgabe geachtet.
... public static String read_write() { StringBuffer buf = new StringBuffer(80); int c; InputStreamReader in = new InputStreamReader(System.in); OutputStreamWriter out = new OutputStreamWriter(System.out); try { while ((c = in.read()) != -1) { char ch = (char) c; out.write(c); if (ch == '\n') break; buf.append(ch); } } catch (IOException e) { System.err.println(e); } return (buf.toString()); } ...