我正在将开源c程序与Java程序集成。
我曾尝试使用JNI,但这并不适合我想做的事情。
c程序的用法与以下相同。
program_name argument1 [-a maxSize] [-o maxSizeO] ...... [-P] \
in.txt in1.dat in2.dat in1.tmp in2.tmp out.txt
我可以像这样使用ProcessBuilder类来运行这个程序。
ProcessBuilder pb = new ProcessBuilder("program_name",
"argument1",
"-a", maxSize,
"-o", maxSizeO.........,
int2.tmp, out.txt);
Process p = pb.start();
但是有很多可选参数,所以它看起来像是一种维护我的Java程序的错误方法。
有没有想法以良好的软件设计方式解决这个问题?
提前致谢。
答案 0 :(得分:2)
ProcessBuilder
正是您所需要的。我刚刚为你编写了一些代码框架。接受并根据您的需要进行修改。
public Process exec(
String programName,
Integer maxSize,
Integer maxSizeO,
String[] inFiles,
String outFile) throws IOException {
ProcessBuilder pb = new ProcessBuilder();
List<String> cmd = new ArrayList<String>();
cmd.add(programName);
if (maxSize != null) {
cmd.add("-a");
cmd.add("" + maxSize);
}
if (maxSizeO != null) {
cmd.add("-o");
cmd.add("" + maxSizeO);
}
if (inFiles != null) {
cmd.addAll(Arrays.asList(inFiles));
}
if (outFile != null) {
cmd.add(outFile);
}
Process p = pb.start();
return p;
}
答案 1 :(得分:0)
我建议您首先为您的功能定义一个界面。此接口定义了设置参数(强制/可选)和执行实际工作的方法。首先,您添加一个使用ProcessBuilder
来完成工作的实现。这样,如果您有更好的解决方案,就可以透明地切换到另一个实现。