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

6 respostas
revton

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.

6 Respostas

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?

Frantic_Avenger

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?


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.

revton

Frantic Avenger:
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?


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.

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

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:

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();
        }
    }
revton
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:
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();
        }
    }

pmlm é isso mesmo, muito obrigado cara.

revton

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.

Criado 25 de julho de 2012
Ultima resposta 25 de jul. de 2012
Respostas 6
Participantes 4