如何知道我的 ProcessBuilder start() 是否成功执行了命令
How to know if my ProcessBuilder start() executed the commands successfully
我正在使用 ProcessBuilder
class 在 java 代码中执行命令。一旦 start()
被调用,我就完成了执行。每次我 运行 这段代码,我去输出并验证 java 代码是否有 运行 命令成功。问题是,我能否在代码本身中验证这一点?而不是每次都验证我的输出。将来我可能无法查看输出,所以我想确保我的命令 运行 成功,或者即使它 运行 出现某些异常,我应该能够从我的代码中知道.
start()
向我返回 Process
class 对象,我几乎找不到 Process
class.
下可用的任何有用方法
代码:
File file = new File(getClass().getClassLoader().getResource(fileName).getFile());
List<String> list = new ArrayList<String>();
list.add(my_command);
String absPath = file.getAbsolutePath();
list.add(absPath);
ProcessBuilder pb = new ProcessBuilder(list);
Process process = pb.start();
List<String> commandList = pb.command();
非常感谢您的帮助!
编辑:
尝试 process.exitValue();
但每次执行代码时都会返回以下错误。请注意,即使我在控制台中看到此异常,我的输出也没有任何问题。
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
at com.rwithjava.caller.RWithJavaCaller.processRWithJavaScript(RWithJavaCaller.java:39)
at com.rwithjava.caller.RWithJavaCaller.main(RWithJavaCaller.java:51)
如果您调用 pb.waitFor,您的程序将等待进程终止和 returns 它的结果代码(如果一切顺利,它应该为零)。
如果这还不够,您应该捕获标准输出和标准错误流并检查您是否得到了预期的结果。
更新
示例代码:
Process process = pb.start();
OutputHandler out
= new OutputHandler(process.getInputStream(), "UTF-8");
OutputHandler err
= new OutputHandler(process.getErrorStream(), "UTF-8");
int status = process.waitFor();
System.out.println("Status: " + status);
out.join();
System.out.println("Output:");
System.out.println(out.getText());
System.out.println();
err.join();
System.out.println("Error:");
System.out.println(err.getText());
Class OutputHandler
:
class OutputHandler extends Thread {
private final StringBuilder buf = new StringBuilder();
private final BufferedReader in;
OutputHandler(InputStream in, String encoding)
throws UnsupportedEncodingException {
this.in = new BufferedReader(new InputStreamReader(
in, encoding == null ? "UTF-8" : encoding));
setDaemon(true);
start();
}
String getText() {
synchronized(buf) {
return buf.toString();
}
}
@Override
public void run() {
// Reading process output
try {
String s = in.readLine();
while (s != null) {
synchronized(buf) {
buf.append(s);
buf.append('\n');
}
s = in.readLine();
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
in.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
我正在使用 ProcessBuilder
class 在 java 代码中执行命令。一旦 start()
被调用,我就完成了执行。每次我 运行 这段代码,我去输出并验证 java 代码是否有 运行 命令成功。问题是,我能否在代码本身中验证这一点?而不是每次都验证我的输出。将来我可能无法查看输出,所以我想确保我的命令 运行 成功,或者即使它 运行 出现某些异常,我应该能够从我的代码中知道.
start()
向我返回 Process
class 对象,我几乎找不到 Process
class.
代码:
File file = new File(getClass().getClassLoader().getResource(fileName).getFile());
List<String> list = new ArrayList<String>();
list.add(my_command);
String absPath = file.getAbsolutePath();
list.add(absPath);
ProcessBuilder pb = new ProcessBuilder(list);
Process process = pb.start();
List<String> commandList = pb.command();
非常感谢您的帮助!
编辑:
尝试 process.exitValue();
但每次执行代码时都会返回以下错误。请注意,即使我在控制台中看到此异常,我的输出也没有任何问题。
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
at com.rwithjava.caller.RWithJavaCaller.processRWithJavaScript(RWithJavaCaller.java:39)
at com.rwithjava.caller.RWithJavaCaller.main(RWithJavaCaller.java:51)
如果您调用 pb.waitFor,您的程序将等待进程终止和 returns 它的结果代码(如果一切顺利,它应该为零)。
如果这还不够,您应该捕获标准输出和标准错误流并检查您是否得到了预期的结果。
更新
示例代码:
Process process = pb.start();
OutputHandler out
= new OutputHandler(process.getInputStream(), "UTF-8");
OutputHandler err
= new OutputHandler(process.getErrorStream(), "UTF-8");
int status = process.waitFor();
System.out.println("Status: " + status);
out.join();
System.out.println("Output:");
System.out.println(out.getText());
System.out.println();
err.join();
System.out.println("Error:");
System.out.println(err.getText());
Class OutputHandler
:
class OutputHandler extends Thread {
private final StringBuilder buf = new StringBuilder();
private final BufferedReader in;
OutputHandler(InputStream in, String encoding)
throws UnsupportedEncodingException {
this.in = new BufferedReader(new InputStreamReader(
in, encoding == null ? "UTF-8" : encoding));
setDaemon(true);
start();
}
String getText() {
synchronized(buf) {
return buf.toString();
}
}
@Override
public void run() {
// Reading process output
try {
String s = in.readLine();
while (s != null) {
synchronized(buf) {
buf.append(s);
buf.append('\n');
}
s = in.readLine();
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
in.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}