"无法运行程序"在程序文件名中使用带有空格的Runtime.exec时

时间:2014-03-14 19:59:46

标签: java process ioexception runtime.exec

我使用以下代码打开“sample.html”文件。

String filename = "C:/sample.html";

String browser = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe";

Runtime rTime = Runtime.getRuntime();

Process pc = rTime.exec(browser + filename);

pc.waitFor();

但是,我收到以下错误。

java.io.IOException: Cannot run program "C:/Program": CreateProcess error=2, The system cannot find the file specified

请有人帮我解决这个问题。提前谢谢。

4 个答案:

答案 0 :(得分:4)

假设第一个标记是命令名,其余是命令行参数,

Runtime.exec(String)会自动在空格处拆分字符串。此外,browserfile之间没有空格,但这不是问题的根本原因。

它认为你想用两个命令行参数运行“C:/ Program”:

  1. “文件”
  2. “(x86)的/google/Chrome/Application/chrome.exeC:/sample.html”
  3. 使用Runtime.exec(String[])代替,这样你可以完全控制什么是:

     String[] command = new String[]{browser, filename};
     Runtime.exec(command);
    

答案 1 :(得分:2)

试试这个。

    String filename = "C:\\sample.html";
    String browser = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";

    Runtime runtime = Runtime.getRuntime();

    try {
        runtime.exec(new String[] {browser, filename});
    } catch (IOException e) {
        e.printStackTrace();
    }

答案 2 :(得分:2)

停止使用Runtime.exec(String) - 问题在于它如何处理单个字符串输入。

错误消息指示如何/在哪里失败:请注意它在“C:/ Program”(或第一个空格)之后停止。这表明exec“错误地”解析了字符串,因此甚至没有找到正确的可执行文件。

  

无法运行程序“C:/ Program”

相反,请考虑使用ProcessBuilder。虽然使用仍然依赖于系统,但ProcessBuilder允许分离可执行文件名(并且需要特别处理它)和参数,并且最难以正确调用目标。

String filename = "C:\\sample.html";
String browser = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";

ProcessBuilder pb = new ProcessBuilder(browser, filename);
// setup other options ..
// .. and run
Process p = pb.start();
p.waitFor();

据我所知,在Windows中,ProcessBuilder会将各个组件包装在引号中;当参数包含引号时,这会产生不同的问题。

答案 3 :(得分:1)

参数必须单独传递:

Process pc = rTime.exec(new String[]{browser, filename});

使用exec()与使用命令行不同 - 您不能使用空格来区分命令及其参数。您的尝试将尝试执行一个命令,其路径是exec和文件名的串联作为一个巨大的字符串。