使用Java程序集成命令行软件

时间:2010-12-08 06:50:52

标签: java design-patterns integration processbuilder

我正在将开源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程序的错误方法。

有没有想法以良好的软件设计方式解决这个问题?

提前致谢。

2 个答案:

答案 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来完成工作的实现。这样,如果您有更好的解决方案,就可以透明地切换到另一个实现。