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());
    }

これを行うより良い方法はありますか?コマンドと引数をカプセル化する、またはそれを行うより一般的な方法は? enum を使用しようとしましたが、静的/定数パラメーター リストがある場合は enum を使用する方が適切であることがわかったので、より良い代替案を探しています。

4

1 に答える 1

0

ProcessBuilderラップしてコマンドラインを作成して実行できる「CommandBuilder」を作成します。

STDOUT をファイルにリダイレクトしようとしてもうまくいかないことに注意してください。リダイレクトはシェルの機能です。シェル経由でコマンドを実行できます (たとえば/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 に答える