"Hej, Amigo! I dag skal du lære at gøre noget nyt: udskifte System.out-objektet."
System.out er en statisk PrintStream- variabel kaldet ud i System- klassen. Denne variabel har den endelige modifikator, så du tildeler den blot en ny værdi. Systemklassen har dog en speciel metode til at gøre dette: setOut(PrintStream stream) . Og det er det, vi vil bruge.

"Interessant. Og hvad skal vi erstatte det med?"

"Vi har brug for et objekt, der kan indsamle outputdata. ByteArrayOutputStream er bedst egnet til dette job. Dette er en speciel klasse, der er en dynamisk (tilpasningsbar) matrix og implementerer OutputStream-grænsefladen."

"En adapter mellem et array og OutputStream?"

"Sådan noget. Sådan ser vores kode ud."

Kode
public static void main(String[] args) throws Exception
{
 //Save the current PrintStream in a special variable
 PrintStream consoleStream = System.out;

 //Create a dynamic array
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Create an adapter for the PrintStream class
 PrintStream stream = new PrintStream(outputStream);
 //Set it as the current System.out
 System.setOut(stream);

 //Call a function that knows nothing about our changes
 printSomething();

 //Convert the data written to our ByteArray into a string
 String result = outputStream.toString();

 //Put everything back to the way it was
 System.setOut(consoleStream);
}

public static void printSomething()
{
 System.out.println("Hi");
 System.out.println("My name is Amigo");
 System.out.println("Bye-bye!");
}

"Og hvad skal vi med denne linje?"

"Nå, hvad end vi vil. For eksempel ville vi vende det. Så ville koden se sådan ud:"

Kode
public static void main(String[] args) throws Exception
{
 //Save the current PrintStream in a special variable
 PrintStream consoleStream = System.out;

 //Create a dynamic array
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Create an adapter for the PrintStream class
 PrintStream stream = new PrintStream(outputStream);
 //Set it as the current System.out
 System.setOut(stream);

 //Call a function that knows nothing about our changes
 printSomething();

 //Convert the data written to our ByteArray into a string
 String result = outputStream.toString();

 //Put everything back to the way it was
 System.setOut(consoleStream);

 //Reverse the string
 StringBuilder stringBuilder = new StringBuilder(result);
 stringBuilder.reverse();
 String reverseString = stringBuilder.toString();

 //Output it to the console
 System.out.println(reverseString);
}

public static void printSomething()
{
 System.out.println("Hi");
 System.out.println("My name is Amigo");
 System.out.println("Bye-bye!");
}

"Hvor interessant! Nu begynder jeg at forstå lidt af de store muligheder, disse små klasser giver."
"Tak for den interessante lektion, Bilaabo."