执行外部Java代码并获取输出

时间:2015-10-31 17:34:17

标签: java shell command-line output

我想从另一个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”。

Hello world

public class Hello
{
    public static void main(String[] args)
    {
        System.out.println("Hello world!");
    }
}

1 个答案:

答案 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();