路径中的空格导致奇怪的行为

3

我有一个奇怪的未知行为出现。在我的应用程序中,我需要启动一个Java进程来执行某些任务。所以在执行以下操作时:

1a) String[] ls = {"cmd",
                "/C",
                "\"C:\\t e m p\\run time\\jre\\bin\\java.exe\"",
                "-jar",
                "Canon.jar"};
ProcessBuilder p = new ProcessBuilder(ls);
p.redirectErrorStream();
Process pp = p.start();

上述方法是完美的。但是,如果Canon.jar的完整路径包含空格,则无法正常工作。基本上,我需要在Canon.jar路径周围添加引号。例如:
1b) String[] ls = {"cmd","/C",
                "\"C:\\Prac\\t e m p\\run time\\jre\\bin\\java.exe\"","-jar",
                 "\"C:\\Prac\\t e m p\\Canon.jar\""};

即使包含引号,上述方法仍然无法正常工作。它会显示以下信息:
“结束'C:\ Users \ Jatin \ Documents \ Prac \ t'不被视为内部或外部命令、可操作程序或批处理文件。”
最大的问题是,下面的方法也无法正常工作:
 1c) String[] ls = {"cmd","/C",
                "\"C:\\Prac\\t e m p\\run time\\jre\\bin\\java.exe\"","-jar",
                 "\"C:\\Prac\\temp\\Canon.jar\""};//contains no white space. 

仍然显示相同的错误。当指向Canon.jar的路径不包含空格时,它怎么可能再次出现呢?为什么在1a可用的情况下会提示java.exe路径存在问题。


但是为什么您的路径中有空格?另外,在1c)中,您的java.exe路径仍然有空格。 - Ankit
也许 \\t 中的 \t 被转义为制表符字符了?只是猜测。 - Roger Rowland
@Ankit 这是为了测试空格。在1c中,如果它能在1a中工作,为什么会在1c中失败,这正是我的观点。 - Jatin
@ajlane,在1a中没有错误。 - Jatin
尝试使用双引号将路径中有空格的单词括起来。例如,在命令提示符中更改目录到“Program Files”需要写成cd "Program Files",否则它将无法工作。我不确定这是否解决了问题,但值得一试。 - Adarsh
双引号已经在上面添加了 :) - Jatin
1个回答

2

您真的需要cmd吗?考虑将其删除。

ProcessBuilder p = new ProcessBuilder(new String[]{"C:\\Prac\\t e m p\\run time\\jre\\bin\\java.exe","-jar",
               "C:\\Prac\\t e m p\\Canon.jar"};

它起作用了。这里的“cmd”是什么意思?你能详细说明一下吗? - Jatin
1
除了摆脱 cmd,还要摆脱路径名称周围不必要的引号。这本身就足够了。错误消息中的完整路径应该会让人想起来。 - devnull
java.exe通常在您的path环境变量中,因此您应该能够直接使用java.exe。同样,jar文件属于您的classpath,因此您可以直接使用Canon.jar。这消除了所有完整路径名的麻烦。 - Marichyasana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接