我想从另一个Java程序中执行Java CLI程序并获取CLI程序的输出。我尝试了两种不同的实现(使用runtime.exec()
和ProcessBuilder
)并且它们不起作用。
这是奇特的部分; 实现工作(捕获输出)以执行pwd
之类的命令但由于某种原因它们没有捕获用java Hello
执行的Hello World java程序的输出。
public static void executeCommand(String command)
{
System.out.println("Command: \"" + command + "\"");
Runtime runtime = Runtime.getRuntime();
try
{
Process process = runtime.exec(command);
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(process.getErrorStream()));
// read the output from the command
System.out.println("Standard output of the command:\n");
String s = null;
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
} catch (Exception e)
{
e.printStackTrace();
}
}
Command: "cd /Users/axelkennedal/Desktop && java Hello"
Standard output of the command:
Standard error of the command (if any):
Command: "pwd"
Standard output of the command:
/Users/axelkennedal/Dropbox/Programmering/Java/JavaFX/Kode
Standard error of the command (if any):
我已经确认Hello
确实在从CLI直接运行Hello
而不是executeCommand()
时向CLI打印“Hello world”。
public class Hello
{
public static void main(String[] args)
{
System.out.println("Hello world!");
}
}
答案 0 :(得分:0)
这个“cd / Users / axelkennedal / Desktop&& java Hello”不是一个命令,而是由&&
分隔的两个命令。一般来说,它意味着执行第一个命令,如果第一个命令成功,则执行第二个命令。您不能将其作为单个命令传递,但您可以自己实现逻辑:
例如执行“cmd1&& cmd2”
if (Runtime.getRuntime().exec("cmd1").waitFor() == 0) {
Runtime.getRuntime().exec("cmd2").waitFor();
}
但是,因为在这种情况下cmd1是更改目录,所以有一种更好的方法,即使用ProcessBuilder的目录功能而不是第一个命令。
Process p = new ProcessBuilder("java","hello")
.directory(new File("/Users/axelkennedal/Desktop"))
.start();