如何使用Runtime.getRuntime()。exec()打开名称中带空格的应用程序?

时间:2012-10-11 21:22:33

标签: java macos exec

所以我正在尝试创建一个通用应用程序,我正在努力让它能够打开应用程序。所以,我想让它打开一个应用程序,如果它是一个单词,但有空格,它永远不会工作。我就是这样做的:

    if(textField.getText().startsWith("application open")){
    try {
        String string1 = textField.getText().substring(17, textField.getText().length());
        Runtime.getRuntime().exec("open /Applications/\"" + string1 + "\".app");
        textArea.append("Opening application " + string1 + "..." + newline);
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    }

如果有人能帮助我,那就太好了! 提前致谢, 霍华德史塔克

5 个答案:

答案 0 :(得分:6)

使用String[]的版本exec

这对我有用:

String cmds[] = { "open", "/Applications/Font Book.app" };
Runtime.getRuntime().exec(cmds);

然而这不是:

Runtime.getRuntime().exec("open /Applications/Font Book.app");

后者只能使用空格来分解命令参数,因此被解析为命令 open ,后跟由空格分隔的2个参数。前者 - exec的版本采用String[] - 单独传递每个参数,因此没有这个问题。

答案 1 :(得分:3)

使用exec的变体分别获取命令和参数。最直接的替代是

Runtime.getRuntime().exec(new String[] {"executable with spaces"})

EXEC(字符串[])

答案 2 :(得分:2)

@ ScArcher2是对的(+1)。

但这个解决方案不是跨平台的。例如,您可能必须在Unix中的空格之前插入\。 更好的解决方案是使用ProcessBuilder而不是Runtime.exec()ProcessBuilder创建可移植命令行并自动支持空格。

答案 3 :(得分:2)

您可以尝试使用ProcessBuilder: http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

使用目录(文件目录)方法设置工作目录(包含空格的目录),然后使用start()启动该过程。

来自javadoc的简化示例:

 ProcessBuilder pb =
   new ProcessBuilder("myCommand", "myArg1", "myArg2");
 pb.directory(new File("myDir"));
 Process p = pb.start();

答案 4 :(得分:1)

使用ProcessBuilder,它的设计目的是让您的生活更轻松

ProcessBuilder pb = new ProcessBuilder("open", "/Applications/\"" + string1 + "\".app");
Process p = pb.start();

正如本文Running shell script from java code and pass arguments

中所述