我有一个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());
}
有更好的方法吗?像封装命令和参数或更通用的方法吗?我尝试使用枚举,但发现当有静态/常量参数列表时,枚举更好用,所以寻找更好的替代方案。
答案 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
}