When running a command line command via ProcessBuilder (specifically \"GetMac /s\") if it throws an error or returns normally and I can read the error or the MAC address tha
You need to handle all the Streams associated with the Process, including the InputStream, ErrorStream and OutputStream. The text you see on the command line will be coming through the InputStream, and you'll then want to pass information requested through the OutputStream.
You'll want to read the InputStream and the ErrorStream both in their own Threads. I often wrap them in a Scanner object if they're passing text, and I often wrap the OutputStream in a BufferedOutputStream, and that in a PrintStream object.
e.g.,
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Scanner;
class Test1 {
private static PrintStream out;
public static void main(String[] args) {
String hostName = "testpc";
String[] commands = {"getmac", "/s", hostName,
"/nh"};
ProcessBuilder builder = new ProcessBuilder(commands);
// builder.inheritIO(); // I avoid this. It was messing me up.
try {
Process proc = builder.start();
InputStream errStream = proc.getErrorStream();
InputStream inStream = proc.getInputStream();
OutputStream outStream = proc.getOutputStream();
new Thread(new StreamGobbler("in", out, inStream)).start();
new Thread(new StreamGobbler("err", out, errStream)).start();
out = new PrintStream(new BufferedOutputStream(outStream));
int errorCode = proc.waitFor();
System.out.println("error code: " + errorCode);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
}
class StreamGobbler implements Runnable {
private PrintStream out;
private Scanner inScanner;
private String name;
public StreamGobbler(String name, PrintStream out, InputStream inStream) {
this.name = name;
this.out = out;
inScanner = new Scanner(new BufferedInputStream(inStream));
}
@Override
public void run() {
while (inScanner.hasNextLine()) {
String line = inScanner.nextLine();
// do something with the line!
// check if requesting password
System.out.printf("%s: %s%n", name, line);
}
}
}