Newsgroup: it.comp.java
Titolo: Catturare l'output di una funzione

Ho una funzione che non restituisce nulla, ma che stampa delle stringhe
a schermo (non so se tramite System.out.print o se System.out.err o se
con altri sistemi...)
Io ho la necessità di memorizzare in una Stringa tutto ciò che tale
funzione stampa a schermo...
Si può fare?
Grazie.
Ale

Ale ha scritto:

Si può fare se cambi le intestazioni dei metodi. Nei parametri metti un 
PrintWriter. Ad esempio:
public void miaFunzione(PrintWriter out){
	....
	out.println("quello che devo stampare");}
A questo punto, se a runtime vuoi stampare sulla console gli passi:
miaFunzione(System.out);
se invece ti serve fare dei log su file, crei un printwriter associato 
ad un FileWriter(vado a memoria, guarda la documentazione)

Non ho modo di modificare la funzione...
Questa funzione credo utilizzi lo stream Err per stampare a video.
Stavo provando a giocare con
System.setErr() per settare lo stream Err non a video ma su uno stream
mio. Quello che non riesco a fare è indirizzare il tutto direttamente
su una stringa....

Ale ha scritto:

Fallo indirettamente: da stream a stringa si può fare. Puoi associare al 
tuo stream un bufferedReader?

Non ho uno stream mio, devo crearne uno appositamente per lo scopo,
quindi almeno in quello sono libero...
In pratica:
out = new Che_cosa_devo_metterci?
System.setErr(out);
parser.parse(xmlFile); //Questo è il metodo che stampa a video e di
cui
                                 //voglio catturare l'output in una
stringa
Grazie :)

Ah dimenticavo di precisare che però il costruttore di System.settErr
è:
System.setErr(PrintStream err);
Quindi out deve essere necessariamente un PrintStream. Da qui riesco
solo a scrivere su file. Io invece voglio scrivere su una stringa....

Ale ha scritto:

Chi ti ha detto che un printStream scrive solo su file? Che mi dici 
allora di System.out? (La colpa è mia, poco fa l'ho erroneamente 
indicato come PrintWriter)

Intendevo dire che io nella mia ignoranza riesco a scrivere solo su
file! :)
Mi sfugge il modo da usare per scrivere su una stringa...
Ho provato così:
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(baos);
            PrintStream out = new PrintStream(bos);
            System.setErr(out);
            parser.parse(xmlFile);
            Document document = parser.getDocument();
            baos.flush();
Ma di baos non so che farmene! asd
Tu avresti qualche suggerimento da darmi? Qualche classe più
appropriata da usare?

 non a video ma su uno stream mio.
non che sia "pulito" ma.
    public static void print(){ System.err.print("prova"); }
    public static String wrappedPrint()
    {
        java.io.PrintStream oldPrintStream = System.err;
        java.io.ByteArrayOutputStream outputStream = new 
java.io.ByteArrayOutputStream();
        java.io.PrintStream newPrintStream = new java.io.PrintStream( 
outputStream);
        System.setErr( newPrintStream );
        try{
            print();
            return outputStream.toString();
        }finally{
            System.setErr( oldPrintStream );
        }
    }
    public static void main(String[] args)
    {
        System.out.println( wrappedPrint() );
    }
-- 
sbi 

Azz, ci ero andato vicino vicino! Mi mancava solo il .toString()!
Volevo quasi provarlo, ma ero sicurissimo che come (quasi) sempre mi
avrebbe stampato la classe sottoforma di stringa, e non solo lo stream!
Grazie mille ad entrambi! Ora funziona alla grande!
Ciao