具有动态路径的ProcessBuilder(可能带有空格)

时间:2015-07-13 11:28:07

标签: java file-io processbuilder

我正在尝试从我的Java应用程序运行外部可执行文件。它驻留在该应用程序的一个包中,但该应用程序的路径可能会有所不同,并且可能包含空格。我试过了:

String broker = MqttServerInterface.class.getResource("broker/mosquitto.exe").getPath();

System.out.println(broker);            
ProcessBuilder pb = new ProcessBuilder(broker,"-p",port);            

server = pb.start();

在没有空格的路径上工作正常。但是,当有空格时,它给出CreateProcess error = 267,目录名无效。

我根据这里的建议改写了代码:ProcessBuilder cannot run bat file with spaces in path

String brokerDir = MqttServerInterface.class.getResource("broker").getPath();            
System.out.println(brokerDir);

ProcessBuilder pb = new ProcessBuilder("mosquitto.exe","-p",port);
pb.directory(new File(brokerDir));
pb.redirectError();

server = pb.start();

但是现在,我仍然得到错误267,路径中有空格而错误2(系统找不到指定的文件)没有。从Java运行可执行文件的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

getResource("res")返回URI这不是文件引用,getPath返回该URI的URLencoded字符串,这是手动替换所有特殊符号的错误方法。因此,让java自己找到URI的正确路径

URL brokerURI = MqttServerInterface.class.getResource("broker/mosquitto.exe");
Path pathToBroker = Paths.get(brokerURI.toURI());    
String brokerCommand = pathToBroker.toString();

答案 1 :(得分:-1)

正如您在评论中发布的那样,System.out.println(broker);的结果显示以下内容:

/N:/dropbox/Dropbox/projects/robot%202.0/prophio%203/prophio3/build/classes/com‌​/trobot/prophio3/broker/mosquitto.exe

这看起来像一个URL编码的URI,它不是文件路径,由其中%20的出现表示。解决这个问题的一种方法是用实际空格替换它们,例如:

broker = broker.replace("%20", " ");