Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hide Java Output

Tags:

java

console

I am using an external library. When a call a method of this library then it outputs some text on console. I want to hide this text from console. How is it possible?

Thanks in Advance

like image 211
Novice Avatar asked Oct 08 '10 22:10

Novice


People also ask

How do I hide the command line in Intellij console output?

Add java.exe at File | Settings | Editor | General | Console, Fold console lines that contain. IDE will collapse the command line and it will be less distracting.


3 Answers

You can redefine system.out (I believe it is System.setOut()) I believe you can set it to NULL (Corrected--you can NOT set it to NULL), but you can set it to ANY output stream.

I did something interesting with this once. I saved "System.out" then redirected it to my own output stream with code in the "print" method--that method is called whenever anyone prints to the stream.

Every time a line of input came in to this class, I'd create a stack trace, grab the trace and dig down to the method that called the System.out.println() method. At this point I could prepend the line and have instant logger functionality--it even shows the line number.

This was probably quite slow but it could be turned on and off very easily.

I could also do all the filtering you'd like without touching the source code. Sometimes I'd filter on a single package, sometimes I'd filter on a class and sometimes it would be strings starting with "BK:" which would only print out my messages.

Overall it was a lot of fun and trivial to remove ALL debug output for production.

(I do not recommend the get stack trace thing for production code, it really should be quite slow even though I didn't notice it)

// class variable
public static final OutputStream out;

{
    out=System.getOutputStream();// I may have the actual name wrong, but it's close
    System.setOutputStream(new OutputStreamThatDoesNothing());
}

at this point any calls to:

Redirect.out("Hello");

Should act just as calls to System.out did.

Since there is no magic with this, you can also do something like this if you really want to:

OutputStream tmp=System.getOutputStream();
System.setOutpuatStream(nullStream);
callOffensiveLibraryMethod();
System.setOutputStream(tmp);

This would only eliminate output within that call BUT would be Very Bad if your application was multi-threaded.

like image 83
Bill K Avatar answered Sep 28 '22 12:09

Bill K


private PrintStream realSystemOut = System.out;
private static class NullOutputStream extends OutputStream {
    @Override
    public void write(int b){
         return;
    }
    @Override
    public void write(byte[] b){
         return;
    }
    @Override
    public void write(byte[] b, int off, int len){
         return;
    }
    public NullOutputStream(){
    }
}
void someMethod(){
    System.setOut(new PrintStream(new NullOutputStream());
    realSystemOut.println("Hello World!"); //prints Hello World!
    System.out.println("Hello World!"); //nothing!
    System.setOut(realSystemOut);
    System.out.println("Hello World!"); //prints Hello World!
}
like image 31
Leo Izen Avatar answered Sep 28 '22 12:09

Leo Izen


For those looking for a 2020 version that also does not require external libraries for the null stream:

PrintStream out = System.out;
System.setOut(new PrintStream(OutputStream.nullOutputStream()));
//
//do stuff with library...
//
System.setOut(out);

Available since Java 11.

like image 45
alistairv Avatar answered Sep 28 '22 11:09

alistairv