[RESOLVIDO] Usar System.out de dentro de um metodo

Pessoal, estou querendo pegar todos os system.out que ocorrem dentro de classes que não tenho acesso e usar.
Um exemplo para ficar melhor o que eu quero.

import javax.swing.JOptionPane;

public class Class1 {
	public static void main(String[] args) {
		metodo1();
		metodo2();
		// Usar os system para imprimir por exemplo em um MessageDialog
		// Atribuir o valor de string que estão no metodo1 e metodo2 ao sytemOut (Sem usar return)
		String systemOut = "";
		JOptionPane.showMessageDialog(null, systemOut);
	}
	
	private static void metodo2() {
		String string = "METODO2!!!!";
		System.out.println(string);
	}

	private static void metodo1(){
		String string = "METODO1!!!!";
		System.out.println(string);
	}
}

Soluções do tipo o metodo1 e metodo2 retornar uma String não são válidos.
A pergunta é tem como eu pegar os System.out.println que estão nos metodo1 e metodo2?

Obrigado.

revton, não entendi o que exatamente você está querendo fazer…

Você que dinamicamente dizer aos métodos 1 e 2 o que ele vão imprimir no System.out.println() ?
Se é isso, que tal passar os valores como parametro para os métodos?

[quote=flaviochess]revton, não entendi o que exatamente você está querendo fazer…

Você que dinamicamente dizer aos métodos 1 e 2 o que ele vão imprimir no System.out.println() ?
Se é isso, que tal passar os valores como parametro para os métodos?[/quote]
Ele quer retornar uma String dos metódos sem dar return pois ele não tem acesso aos códigos dos métodos.
Resumindo pelo que entendi é isso.

[quote=Frantic Avenger][quote=flaviochess]revton, não entendi o que exatamente você está querendo fazer…

Você que dinamicamente dizer aos métodos 1 e 2 o que ele vão imprimir no System.out.println() ?
Se é isso, que tal passar os valores como parametro para os métodos?[/quote]
Ele quer retornar uma String dos metódos sem dar return pois ele não tem acesso aos códigos dos métodos.
Resumindo pelo que entendi é isso.[/quote]

Exatamente isso Frantic Avenger, alguém tem uma ideia de como fazer isso?

O System.out é um PrintStream. Podes fazer System.setOut com outro PrintStream e o System.out passa a escrever para esse PrintStream.

No caso específico:

private void doWork() {
        //stores original out
        PrintStream originalOut = System.out;
        
        //Creates my out and sets it as standard out
        StringOutputStream myStringOut = new StringOutputStream();
        PrintStream newOut = new PrintStream(myStringOut);
        System.setOut(newOut);
        
        //invoke methods with println
        randomMethod();
        anotherRandomMethod();

        //restore System out
        System.setOut(originalOut);
        
        //now print saved string
        System.out.println("ONLY PRINT IN THE END: " + myStringOut.getString());

}    

private void randomMethod() {
        System.out.println("Random String");
}

private void anotherRandomMethod() {
       System.out.println("bla bla bla");
       System.out.println("other line with bla bla bla");
}

E a class StringOutputStream:


    class StringOutputStream extends OutputStream {

        StringBuilder str = new StringBuilder();

        public void write(int b) throws IOException {
            str.append((char) b);
        }

        public String getString() {
            return str.toString();
        }
    }

[quote=pmlm]O System.out é um PrintStream. Podes fazer System.setOut com outro PrintStream e o System.out passa a escrever para esse PrintStream.

No caso específico:

private void doWork() {
        //stores original out
        PrintStream originalOut = System.out;
        
        //Creates my out and sets it as standard out
        StringOutputStream myStringOut = new StringOutputStream();
        PrintStream newOut = new PrintStream(myStringOut);
        System.setOut(newOut);
        
        //invoke methods with println
        randomMethod();
        anotherRandomMethod();

        //restore System out
        System.setOut(originalOut);
        
        //now print saved string
        System.out.println("ONLY PRINT IN THE END: " + myStringOut.getString());

}    

private void randomMethod() {
        System.out.println("Random String");
}

private void anotherRandomMethod() {
       System.out.println("bla bla bla");
       System.out.println("other line with bla bla bla");
}

E a class StringOutputStream:

[code]

class StringOutputStream extends OutputStream {

    StringBuilder str = new StringBuilder();

    public void write(int b) throws IOException {
        str.append((char) b);
    }

    public String getString() {
        return str.toString();
    }
}

[/code][/quote]

pmlm é isso mesmo, muito obrigado cara.

No caso que eu precisava ficou assim:

import java.io.PrintStream;

public class Class1 {
	public static void main(String[] args) {
		 PrintStream originalOut = System.out;
	        
        //Creates my out and sets it as standard out
        StringOutputStream myStringOut = new StringOutputStream();
        PrintStream newOut = new PrintStream(myStringOut);
        System.setOut(newOut);
		
		metodo1();
		metodo2();
		
		 //restore System out
        System.setOut(originalOut);
	}
	
	private static void metodo2() {
		System.out.println("METODO2!!!!");
	}


	private static void metodo1() {
		System.out.println("METODO1!!!!");
	}

}
import java.io.IOException;
import java.io.OutputStream;

class StringOutputStream extends OutputStream {

	StringBuilder str = new StringBuilder();
	int cont = 0;

	public void write(int b) throws IOException {
		str.append((char) b);
		showConsole(String.valueOf(str.charAt(cont)));
		cont++;
	}
}

Muito obrigado pmlm.