0

我有一个具有多种方法的 impl 类,它们基本上都使用具有不同参数列表的 runtime.exec 调用脚本,例如

public String doExport(String ruleIds, String fileName) throws Exception{
        StringBuffer cmd = new StringBuffer();
        cmd.append(SOME_SCRIPT + " -a export ");
        cmd.append(" -f " );
        cmd.append(fileName);
        cmd.append(" -r " );
        cmd.append(ruleIds);
        cmd.append(" 2>/dev/null");
        return execCmd(cmd.toString());
    }

    public String doImport(String fileName, String user, String iface) throws Exception {
        StringBuffer cmd = new StringBuffer();
        cmd.append(SOME_SCRIPT + " -a import ");
        cmd.append(" -f " );
        cmd.append(fileName);
        cmd.append(" -m " );
        cmd.append("user");
        cmd.append(" -u " );
        cmd.append(user);
        cmd.append(" -I " );
        cmd.append(iface);
        return execCmd(cmd.toString());
    } 
public String setRulesMode(String mode) throws Exception {
        String cmd = SOME_SCRIPT + " -a ";
        return execCmd(cmd.toString());
    }

有没有更好的方法来做到这一点?喜欢封装命令和参数或更通用的方法?我尝试使用枚举,但发现当有静态/常量参数列表时使用枚举更好,因此寻找更好的替代方法。

4

1 回答 1

0

我将创建包装ProcessBuilder并能够编写和运行命令行的“CommandBuilder”。

请注意,您尝试将 STDOUT 重定向到文件将不起作用。重定向是一个 shell 功能。您可以通过 shell 运行命令(例如/bin/sh YOUR COMMAND >YOURFILE在 unix 或 cmd -c YOUR COMMAND >YOURFILEwindows 上)。

更好的方法是Process.setOutputStream()从java中使用。它是可移植的,更易于调试和维护。这可以是您的CommandBuilder.

编辑

以下是 CommandBuilder 结构的一些提示。

public class CommandBuilder {
    public void setPrefix(); // e.g. cmd or /bin/sh But some kind of automatic logic should be implemented too, i.e. cmd for windows, /bin/sh for unix
    public void setCommand(); // for example ping
    public void addArgument(String value);  // e.g. myhost
    public void setInputStream(InputStream in);
    public void setOutputStream(OutputStream in);

    // add appropriate getters.

    public Process exec();
    public int execAndWait(); // returns process status
}
于 2012-10-11T19:15:00.463 回答