从Java执行命令

时间:2014-05-23 16:35:15

标签: java

我试图从Java程序执行脚本:

public class TestCommandLine 
{
    public static void main (String[] args) 
    {
        String PATH = "/path/programs/";
        String command = PATH + "name_programs param1 param2";
        executeCommand (command);
    }

    private static String executeCommand (String command) 
    {
        StringBuffer output = new StringBuffer();
        String line = "";
        Process p;

        try {
            p = Runtime.getRuntime ().exec (command);
            p.waitFor ();
            BufferedReader reader = new BufferedReader (new InputStreamReader (p.getInputStream ()));


            while ((line = reader.readLine ()) != null) {
                output.append (line + "\n");
            }

        } 
        catch (Exception e) {
            e.printStackTrace ();
        }

        return output.toString ();
    }
}

没有错误,但程序没有运行。我也尝试使用stackoverflow中的其他解决方案,但它们都没有工作

3 个答案:

答案 0 :(得分:0)

如果你给出了实际的命令,那就更快了。

您不能使用Process.exec来运行shell解释的命令。相反,它直接执行程序。因此输入/输出重定向(|>等)是不可能的。 如果您实际读取了stderr(getErrorStream())输出,那么可能会出现"无效参数:>"。

你要么:

  • 使用Java重定向输出。从进程的标准输出(getInputStream())中读取并写入某种类型的FileOutputStream。
  • 直接执行shell而不是命令。例如/bin/sh -c "command arg > file"。引用的部分必须作为单个参数传递给sh。在这种情况下,您将无法在stdout中看到任何内容,并且必须打开并读取您刚写入的文件。第一种选择可能更明智。

正如其他地方所指出的那样,除非你期望输出的数量非常少,否则在使用流之前你不应该等待命令退出。

答案 1 :(得分:-1)

我唯一一次这样做的时候我用过这样的东西:

Process p = Runtime.getRuntime().exec("foo.exe");

你试过吗?如果是这样,你得到的错误是什么?

答案 2 :(得分:-1)

您的命令正在生成您想要读取的输出,但是在命令完成所有操作并且已退出之前您拒绝读取任何输出(在之后}之前不调用getInputStream() waitFor())。

如果你的命令没有产生太多输出,那就没关系,Java可以缓冲它。但是如果你的命令产生大量输出,那么Java就无法缓冲它,并且命令会被阻塞。

操作系统不会让命令再写入输出,因为Java的缓冲区已满,你还没有指示Java清空它。所以程序被阻止了,Java的waitFor()将永远不会回来。

要解决您的问题,您应该在从getInputStream()获取Process对象后立即致电exec(),然后您应该创建一个负责阅读的新Thread命令输出到StringBuffer

然后您应该waitFor()完成该过程,看它是否成功退出,然后您可以等待线程到达输入流的末尾并完成 - 此时,它是安全的使用命令的完整输出读取StringBuffer