„Hallo Amigo! Heute wirst du etwas Neues lernen: wie du das System.out-Objekt ersetzt.“
System.out ist eine statische PrintStream-Variable namens out in der System-Klasse. Diese Variable hat den Modifikator final, also weist du ihr einfach einen neuen Wert zu. Die System-Klasse verfügt jedoch über eine spezielle Methode, um dies zu tun: setOut(PrintStream stream). Und genau das werden wir nutzen.

„Interessant. Und durch was werden wir sie ersetzen?“

„Wir brauchen ein Objekt, das die Ausgabedaten sammeln kann. ByteArrayOutputStream ist für diese Aufgabe bestens geeignet. Dies ist eine spezielle Klasse, die ein dynamisches (in seiner Größe veränderbares) Array ist und das OutputStream-Interface implementiert

„Ein Adapter zwischen einem Array und OutputStream?“

„Sowas in der Art. So sieht unser Code aus.“

Code
public static void main(String[] args) throws Exception
{
 //Aktuellen PrintStream in einer speziellen Variablen speichern
 PrintStream consoleStream = System.out;

 //Dynamisches Array erstellen
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Adapter für die PrintStream-Klasse erstellen
 PrintStream stream = new PrintStream(outputStream);
 //Als aktuelles System.out festlegen
 System.setOut(stream);

 //Eine Funktion aufrufen, die nichts von unseren Veränderungen weiß
 printSomething();

 //In unser ByteArray geschriebene Daten in eine Zeichenkette umwandeln
 String result = outputStream.toString();

 //Alles wieder so einrichten, wie es war
 System.setOut(consoleStream);
}

public static void printSomething()
{
 System.out.println("Hi");
 System.out.println("Mein Name ist Amigo");
 System.out.println("Auf Wiedersehen!");
}

„Und was machen wir mit dieser Zeile?“

„Na, was immer wir wollen. Wir können sie zum Beispiel umkehren. Dann würde der Code wie folgt aussehen:“

Code
public static void main(String[] args) throws Exception
{
 //Aktuellen PrintStream in einer speziellen Variablen speichern
 PrintStream consoleStream = System.out;

 //Dynamisches Array erstellen
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Adapter für die PrintStream-Klasse erstellen
 PrintStream stream = new PrintStream(outputStream);
 //Als aktuelles System.out festlegen
 System.setOut(stream);

 //Eine Funktion aufrufen, die nichts von unseren Veränderungen weiß
 printSomething();

 //In unser ByteArray geschriebene Daten in eine Zeichenkette umwandeln
 String result = outputStream.toString();

 //Alles wieder so einrichten, wie es war
 System.setOut(consoleStream);

 //Zeichenkette umkehren
 StringBuilder stringBuilder = new StringBuilder(result);
 stringBuilder.reverse();
 String reverseString = stringBuilder.toString();

 //Ausgabe auf der Konsole
 System.out.println(reverseString);
}

public static void printSomething()
{
 System.out.println("Hi");
 System.out.println("Mein Name ist Amigo");
 System.out.println("Auf Wiedersehen!");
}

„Sehr interessant! So langsam verstehe ich, welche großartigen Möglichkeiten diese kleinen Klassen bereithalten.“
„Danke für die interessante Lektion, Bilaabo.“