我试图从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中的其他解决方案,但它们都没有工作
答案 0 :(得分:0)
如果你给出了实际的命令,那就更快了。
您不能使用Process.exec
来运行shell解释的命令。相反,它直接执行程序。因此输入/输出重定向(|
,>
等)是不可能的。
如果您实际读取了stderr(getErrorStream()
)输出,那么可能会出现"无效参数:>"。
你要么:
getInputStream()
)中读取并写入某种类型的FileOutputStream。/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
。