使用参数封装命令的更好方法

时间:2012-10-11 19:02:40

标签: java encapsulation

我有一个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());
    }

有更好的方法吗?像封装命令和参数或更通用的方法吗?我尝试使用枚举,但发现当有静态/常量参数列表时,枚举更好用,所以寻找更好的替代方案。

1 个答案:

答案 0 :(得分:0)

我创建" CommandBuilder"包装ProcessBuilder并能够编写并运行命令行。

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

更好的方法是使用java中的Process.setOutputStream()。它便于携带,易于调试和维护。这可以是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
}