Решил разобрарться основательно, дошел до определенного момента и все капец. Этот код делает текст заглавными. Я полез в документацию и рассматривал работу с первой строки PrintStream consoleStream = System.out; - тут понятно. ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - тут, выделяется память под динамический массив byte[], так как конструктор по умолчанию, его размер будет 32 байта. PrintStream myStream = new PrintStream (outputStream); тут, создается объект, в качестве параметров коснтруктора добавляем наш массив, т.к. ByteArrayOutputStream является дочерним PrintStream мы можем его добавить в качестве параметров, как я понял из документации результят работы конструктора - он нам просто возвращает наш объект только с возможностью использования методов PrintStream. System.setOut(myStream); а здесь я что то не совсем понимаю что происходит, и ка происходит сама подмена
public class Solution {
    public static TestString testString = new TestString();

    public static void main(String[] args) throws FileNotFoundException {
        PrintStream consoleStream = System.out;
        ByteArrayOutputStream outputStream  = new ByteArrayOutputStream();
        PrintStream myStream = new PrintStream(outputStream);

        System.setOut(myStream);
        testString.printSomething();
        String result = outputStream.toString().toUpperCase();

        System.setOut(consoleStream);
        System.out.println(result);


    }

    public static class TestString {
        public void printSomething() {
            System.out.println("it's a text for testing");
        }
    }
}