smeeb
smeeb

Reputation: 29487

Java Runtime not capturing STDOUT on Mac

Mac OS here, but looking for a solution that is platform agnostic. Also please note, even though Consul is mentioned here, it is just arbitrary and the solution should have nothing to do with, nor require knowledge of, Consul.


When I open a shell and run consul -v (to determine if Consul is installed locally), I get the following STDOUT:

Consul v0.5.2
Consul Protocol: 2 (Understands back to: 1)

When I run the following code:

public class VerifyConsul {
    public static void main(String[] args) {
        PrintStream oldPS = System.out;
        try {
            Runtime runtime = Runtime.getRuntime();
            Process proc;

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PrintStream newPS = new PrintStream(baos);

            System.setOut(newPS);
            proc = runtime.exec(“consul -v”);
            proc.waitFor();

            String capturedOut = baos.toString();

            if(capturedOut.isEmpty()) {
                throw new IllegalArgumentException(“Consul not found.”);
            }
        } catch(Throwable t) {
            System.out.println(t.getMessage());
            System.setOut(oldPS);
        }
    }
}

I get the IllegalArgumentException stating that Consul [is] not found.

What is wrong with my code? Why isn’t it “hooking”/capturing STDOUT?

Upvotes: 0

Views: 75

Answers (1)

user180100
user180100

Reputation:

Use Process#getInputStream() to read STDOUT or Process#getErrorStream() to read STDERR

Here's an example (using java process and reading STDERR):

package so32589604;

import org.apache.commons.io.IOUtils;

public class App {
    public static void main(String[] args) throws Exception {
        final Runtime runtime = Runtime.getRuntime();
        final Process proc = runtime.exec("java -version");
        proc.waitFor();
        // IOUtils from apache commons-io
        final String capturedOut = IOUtils.toString(proc.getErrorStream());

        System.out.println("output = " + capturedOut);
        if(capturedOut.isEmpty()) {
            throw new IllegalArgumentException("Java not found.");
        }
    }
}

Upvotes: 1

Related Questions