【问题标题】:How do I open a application with spaces in the name using Runtime.getRuntime().exec()?如何使用 Runtime.getRuntime().exec() 打开名称中包含空格的应用程序?
【发布时间】:2012-10-11 21:22:33
【问题描述】:

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

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

如果有人可以帮助我,那就太好了! 提前致谢, 霍华德·斯塔克

【问题讨论】:

标签: java macos exec


【解决方案1】:

使用采用String[]exec 版本:

这对我有用:

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

而这不是:

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

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

【讨论】:

    【解决方案2】:

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

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

    执行(字符串[])

    【讨论】:

      【解决方案3】:

      @ScArcher2 是对的 (+1)。

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

      【讨论】:

      • 无论出于何种原因,我的回答都不起作用。看起来使用 Runtime 的最佳方式是使用 String[] 的命令行参数。
      【解决方案4】:

      您可以尝试改用 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();
      

      【讨论】:

        【解决方案5】:

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

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

        正如本文Running shell script from java code and pass arguments中解释的那样

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-22
          • 2017-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多