"Ciao, Amigo! Oggi imparerai a fare qualcosa di nuovo: sostituire l'oggetto System.out."
System.out è una variabile PrintStream statica richiamata nella classe System . Questa variabile ha il modificatore finale , quindi le assegni semplicemente un nuovo valore. Tuttavia, la classe System dispone di un metodo speciale per eseguire questa operazione: setOut(PrintStream stream) . Ed è quello che useremo.

"Interessante. E con cosa lo sostituiremo?"

"Abbiamo bisogno di un oggetto in grado di raccogliere i dati di output. ByteArrayOutputStream è il più adatto per questo lavoro. Questa è una classe speciale che è un array dinamico (ridimensionabile) e implementa l'interfaccia OutputStream."

"Un adattatore tra un array e OutputStream?"

"Qualcosa del genere. Ecco come appare il nostro codice."

Codice
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!");
}

"E cosa faremo con questa linea?"

"Bene, qualunque cosa vogliamo. Ad esempio, lo invertiremmo. Quindi il codice sarebbe simile a questo:"

Codice
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!");
}

"Che interessante! Ora sto cominciando a capire un po' delle grandi capacità fornite da queste piccole classi."
"Grazie per l'interessante lezione, Bilaabo."