2

所以我正在尝试制作一个通用的应用程序,并且我正在尝试使其具有打开应用程序的能力。所以,我想办法让它打开一个应用程序,如果它是一个单词,但有空格,它永远不会起作用。我就是这样做的:

    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();
    }
    }

如果有人可以帮助我,那就太好了!在此先感谢霍华德·斯塔克

4

5 回答 5

6

使用exec需要的版本String[]

这对我有用:

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

而这不是:

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

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

于 2012-10-11T21:29:30.460 回答
3

使用 exec 的变体,它分别接受命令和参数。最直接的替换是

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

执行(字符串[])

于 2012-10-11T21:29:06.007 回答
2

@ScArcher2 是对的 (+1)。

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

于 2012-10-11T21:31:47.703 回答
2

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

使用 directory(File directory) 方法设置工作目录(包含空格的目录),然后使用 start() 启动进程。

来自 javadoc 的简化示例:

 ProcessBuilder pb =
   new ProcessBuilder("myCommand", "myArg1", "myArg2");
 pb.directory(new File("myDir"));
 Process p = pb.start();
于 2012-10-11T21:34:38.847 回答
1

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

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

正如这篇文章从java代码运行shell脚本并传递参数中所解释的那样

于 2012-10-11T21:40:46.130 回答