JAVA使用RUNTIME调用EXE可执行程序

本示例为一个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文件需要读取自己的配置文件。在未指定最后一个参数的情况下,可能会找不到配置文件。