从java代码调用exe文件

时间:2014-04-03 08:17:33

标签: java exec sift

我正在尝试使用此处提供的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

2 个答案:

答案 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个元素的数组......

  • “image.jpg的”
  • “--detector densesampling”
  • “--ds_spacing 6”
  • “--ds_scales 1.2”
  • “--descriptor opponentsift”
  • “ -​​ output out.descr”

虽然这看起来似乎并不多,但通常情况下,每个空格都会在参数数组中生成一个单独的元素......

Process process = new ProcessBuilder(
    "colorDescriptor.exe", 
    "image.jpg", 
    "--detector", "densesampling",
    "--ds_spacing", "6", 
    "--ds_scales", "1.2",
    "--descriptor", "opponentsift", 
    "--output", "out.descr").start();

关于ProcessBuilder的好处是你不需要尝试引用或转义空格,如果你需要传递一个包含空格的路径,真的很方便。