在Java代码里调用外部程序时,比如一个ksh等,可以用如下方法:
The ProcessBuilder.start()
and Runtime.exec
methods create a native process and return an instance of a subclass of Process
that can be used to control the process and obtain information about it.
所以在调用外部程序时,使用process将启动一个新进程,用于执行外部程序。使用waitfor()等待外部程序执行完毕并返回值。
String command = String.format(CHECK_GRAPH_IS_RUNNING_FORMAT, recoveryFile.getAbsolutePath());
Process process = execCommand(command);
int isRunningExitCode = process.waitFor();
return (SUCCESS_EXIT_VALUE == isRunningExitCode);
protected Process execCommand(final String command) throws IOException {
return Runtime.getRuntime().exec(command, getEnvp(), getWorkingFolder());
}
process.waitFor();
causes the current thread to wait, if necessary, until the process represented by this Process
object has terminated. This method returns immediately if the subprocess has already terminated. If the subprocess has not yet terminated, the calling thread will be blocked until the subprocess exits.
the exit value of the process. By convention, 0
indicates normal termination.
返回的这个参数isRunningExitCode 就是command运行的返回值。
此外,当运行外部程序出现错误时,可以很方便的抓取返回信息并进一步加以分析。
private Process process;
process = launchTaskProcess();
processOutStreamLog = process == null ? EMPTY : NEW_LINE + "Task process out stream >>>> " + NEW_LINE
+ readInputStream(process.getInputStream());
processErrorStreamLog = process == null ? EMPTY : NEW_LINE + "Task process error stream >>>> "
+ NEW_LINE + readInputStream(process.getErrorStream());
这里的process.getInputStream() 和 process.getErrorStream() 就可以取得执行的process的outputmessage.