我正在尝试使用此处提供的colosift探测器:colorDescriptor。我实际上尝试从java调用可执行的colorDescriptror.exe文件。我已经使用bat文件运行它,我只想从我的java代码中调用exe。我的代码如下:
Process process = new ProcessBuilder("colorDescriptor.exe", "image.jpg", " --detector densesampling "," --ds_spacing 6", " --ds_scales 1.2 "," --descriptor opponentsift ", " --output out.descr").start();
InputStream is = (InputStream) process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
可执行文件似乎正在运行,但我从colorsift代码中收到错误:警告:没有要写入的输出文件。因此,我想知道哪个是在可执行文件中解析我的参数的正确方法。
工作指令:
colorDescriptor image.jpg --detector densesampling --ds_spacing 6 --ds_scales 1.2 --descriptor opponentsift --output out.descr
答案 0 :(得分:1)
将参数对拆分为单独的参数,不带前导和尾随空格。例如:
" --detector densesampling "
应该是:
"--detector", "densesampling"
对其他参数对进行相同的更改。否则,发布代码中的参数对将作为单个参数发送到底层程序,程序将无法识别。
答案 1 :(得分:1)
传递给ProcessBuilder
的每个参数都是传递给命令的参数,例如......
Process process = new ProcessBuilder("colorDescriptor.exe", "image.jpg", " --detector densesampling "," --ds_spacing 6", " --ds_scales 1.2 "," --descriptor opponentsift ", " --output out.descr").start();
会导致将一个参数数组传递给可执行文件,从而产生一个包含6个元素的数组......
虽然这看起来似乎并不多,但通常情况下,每个空格都会在参数数组中生成一个单独的元素......
Process process = new ProcessBuilder(
"colorDescriptor.exe",
"image.jpg",
"--detector", "densesampling",
"--ds_spacing", "6",
"--ds_scales", "1.2",
"--descriptor", "opponentsift",
"--output", "out.descr").start();
关于ProcessBuilder
的好处是你不需要尝试引用或转义空格,如果你需要传递一个包含空格的路径,真的很方便。