2011-01-25 7 views
30

Aşağıdaki kod kullanılarak System.out'u/dev/null'a geçici olarak yeniden yönlendirmeyi denedim, ancak çalışmaz.Java'da, System.out'u null'a yeniden yönlendirip sonra tekrar stdout'a nasıl yeniden yönlendirebilirim?

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!!! 

Herhangi bir fikri olan var mı?

+0

Her iki hattı da sistemimde iyi görüyorum. Java 6 update 22 kullanıyorum. –

+2

BTW: Birden fazla iş parçacığı tarafından eşzamanlı etkileşimleri önlemek için daha geniş bir eşitleme olmadan System.out'u böyle manipüle etmekten kaçının. –

cevap

43

Dostum, bu çok iyi değil çünkü Java çapraz platform ve '/ dev/null' Unix'e özgü (görünüşe göre Windows'da bir alternatif var, yorumları okuyun). En iyi seçeneğiniz, çıkışı devre dışı bırakmak için özel bir OutputStream oluşturmaktır.

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 
    } 

    } 

} 
+3

Pencerelerde, NUL cihazında alternatif var; IIRC bu "NULL:" bir "dosya adı" olarak. –

+0

oh vay, bu ilk kez bunu duyduğum zaman! Gönderiyi düzenleyeceğim. Teşekkür ederim! –

+3

Ancak +1, çünkü bu platform bağımsız bir cevaptır. Bununla birlikte, verimlilik için yazmayı (bayt [], int, int) geçersiz kılardım. –

15

Sen olarak aşağıda sınıf NullPrintStream kullanabilirsiniz Windows hile mi?

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

Çok az kod ve bana oldukça direkt görünüyor.

+0

NullPrintStream'i nereden alabilirim? Hangi kütüphane? Yoksa dersi kendim mi yaratmalıyım? –

+0

Bu koduma gerçekten ihtiyacım vardı ... Stdout'u susturmak için kesinlikle bir hayat kurtarıcı. –

2

Eski bir soru, biliyorum, ama bu küçük hat yapacağını ... sınıf NullPrintStream olduğunu

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

Ve:

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

Bence System.setOut (null); de çalışmalı. En azından benim için çalıştı.

+1

Daha sonraki herhangi bir System.out.anything çağrısı, NullPointerException'ın atılmasına neden olur. Bu senin için işe yararsa, o zaman bir yerde istisna yakalamak gerekir. –

İlgili konular