本示例为一个webservice项目,需要在其中调用C++写的可执行程序。可执行程序及其配置文件放在了src文件夹下的cplus包内。示例中的C++程序名为Data_Trans.exe 本可执行程序可以通过命令行调用。在后面通过空格间隔 带两个日期型字符串作为参数。
代码如下:
package com.stalvan;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class IDemoImpl implements IDemo {
@Override
public String queryCityInfo(String beginTime, String endTime) {
String result = "数据获取失败";
StringBuilder cmdBuilder = new StringBuilder();
String dir = this.getClass().getClassLoader().getResource("/").getPath()+"cplus";
String exePath = dir + "/Data_Trans.exe";
cmdBuilder.append(exePath);
cmdBuilder.append(" ");
cmdBuilder.append(beginTime);
cmdBuilder.append(" ");
cmdBuilder.append(endTime);
try {
result = exeCmd(cmdBuilder.toString(),dir);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
private String exeCmd(String commandStr,String dir) throws IOException {
String result = "";
BufferedReader br = null;
try {
Process p = Runtime.getRuntime().exec(commandStr,null,new File(dir));
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
result = sb.toString();
} catch (IOException e) {
e.printStackTrace();
throw e;
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}
}
其中的 Process p = Runtime.getRuntime().exec(commandStr,null,new File(dir));
这个方法的最后一个参数为exe文件的工作目录。如果exe文件需要读取自己的配置文件。在未指定最后一个参数的情况下,可能会找不到配置文件。