2011-01-25 2 views
30

Ho provato a reindirizzare temporaneamente System.out a/dev/null usando il seguente codice ma non funziona.In Java, come posso reindirizzare System.out su null e poi di nuovo su stdout?

System.out.println("this should go to stdout"); 

PrintStream original = System.out; 
System.setOut(new PrintStream(new FileOutputStream("/dev/null"))); 
System.out.println("this should go to /dev/null"); 

System.setOut(original); 
System.out.println("this should go to stdout"); // This is not getting printed!!! 

Qualcuno ha qualche idea?

+0

Vedo entrambe le linee sul mio sistema. Sto usando Java 6 update 22. –

+2

BTW: Attenzione a manipolare System.out in questo modo senza una sincronizzazione più ampia per evitare interazioni simultanee da più thread. –

risposta

43

Man, questo non va bene, perché Java è multipiattaforma e '/ dev/null' è specifico per Unix (apparentemente c'è un'alternativa su Windows, leggi i commenti). Quindi la tua migliore opzione è creare un OutputStream personalizzato per disabilitare l'output.

try { 
    System.out.println("this should go to stdout"); 

    PrintStream original = System.out; 
    System.setOut(new PrintStream(new OutputStream() { 
       public void write(int b) { 
        //DO NOTHING 
       } 
      })); 
    System.out.println("this should go to /dev/null, but it doesn't because it's not supported on other platforms"); 

    System.setOut(original); 
    System.out.println("this should go to stdout"); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 
+3

In alternativa su Windows, il dispositivo NUL; IIRC è "NUL:" come "nome file". –

+0

oh wow, questa è davvero la prima volta che ne sento parlare! Modificherò il post. Grazie! –

+3

Ma +1, perché questa è la risposta indipendente dalla piattaforma giusta. Vorrei, tuttavia, anche sovrascrivere write (byte [], int, int), per efficienza. –

15

È possibile utilizzare la classe di NullPrintStream seguito come:

PrintStream original = System.out; 
System.setOut(new NullPrintStream()); 
System.out.println("Message not shown."); 
System.setOut(original); 

E la NullPrintStream classe è ...

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 

public class NullPrintStream extends PrintStream { 

    public NullPrintStream() { 
    super(new NullByteArrayOutputStream()); 
    } 

    private static class NullByteArrayOutputStream extends ByteArrayOutputStream { 

    @Override 
    public void write(int b) { 
     // do nothing 
    } 

    @Override 
    public void write(byte[] b, int off, int len) { 
     // do nothing 
    } 

    @Override 
    public void writeTo(OutputStream out) throws IOException { 
     // do nothing 
    } 

    } 

} 
+0

Dove posso ottenere NullPrintStream? Quale libreria? O devo creare la classe da solo? –

+0

Avevo davvero bisogno di questo per il mio codice ... È sicuramente un po 'un salvataggi per silenziare lo stdout. –

2

vecchia questione, lo so, ma sarebbe questa piccola linea fare il trucco su Windows?

System.setOut(new PrintStream(new File("NUL")));

Molto meno codice e sembra piuttosto diretta a me.

-3

Penso System.setOut (null); dovrebbe funzionare anche Almeno ha funzionato per me.

+1

Qualsiasi successiva chiamata a System.out.anything causerà il lancio di una NullPointerException. Se quello ha funzionato per te, allora devi essere in grado di catturare l'eccezione da qualche parte. –