Java中命令行參數解析

Apache.Commons.CLI

The Apache Commons CLI library provides an API for parsing command line options passed to programs. It's also able to print help messages detailing the options available for a command line tool.

Commons CLI supports different types of options:

  • POSIX like options (ie. tar -zxvf foo.tar.gz)
  • GNU like long options (ie. du --human-readable --max-depth=1)
  • Java like properties (ie.java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo)
  • Short options with value attached (ie. gcc -O2 foo.c)
  • long options with single hyphen (ie. ant -projecthelp)

Maven倉庫

        <dependency>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
            <version>1.3</version>
        </dependency>

Example:

如果想要得到下面的一個參數列表:

java wordcount [-help] [-O][value] [-c] <filename> otherfilename
//演示使用的是1.3的版本
public static void main(String[] args) throws IOException, ParseException {
        //option的容器
        Options options = new Options();
        //boolean型的option
        options.addOption("help",false,"help information");
        //當第二參數是true時,可以是這樣的參數  -O4
        options.addOption("O",true,"you can set a value after the O");
        Option c = Option.builder("c")  //option的名字,判斷的時候要使用這個名字
                 .required(false)               //是否必須有這個選項
                 .hasArg()                         //帶一個參數
                 .argName("filename")     //參數的名字
                 .desc("return sum of characters")  //描述
                 .build();                             //必須有
        //將c這個option添加進去
        options.addOption(c);
        
        //parser
        CommandLineParser parser = new DefaultParser();

        CommandLine cmd = parser.parse(options,args);
        //詢問是否有help
        if(cmd.hasOption("help")) {
           //調用默認的help函數打印
            HelpFormatter formatter = new HelpFormatter();
            formatter.printHelp( "java wordcount [OPTION] <FILENAME>", options );
            return;
        }

        if(cmd.hasOption("c")){
//          獲得相應的選項(c)的參數
            String filename = cmd.getOptionValue("c");
            System.out.println(filename);
//          do something
}
        //將除了選項之外的參數打印出來 otherfilename
        String[] s = cmd.getArgs();
        for(String e : s){
            System.out.println("="+e);
        }

PS:自己的CommandLine Parser即是Scanner

疑惑

        Option c = Option.builder("c")  //option的名字 貌似沒什么卵用?
                 .required(false)               //是否必須有這個選項
                 .hasArg()                         //帶一個參數
                 .argName("filename")     //參數的名字
                 .desc("return sum of characters")  //描述
                 .build();                             //必須有

為什么創建Option的時候要用一個build這樣一個中間的類來創建,不直接使用new之類的關鍵字創建不是更好嗎?反正我看了一下build()函數也只是將屬性直接賦值過去而已?是用了什么設計模式嗎?還是為了安全考慮?
其實最后還是內部給new出來了不是嗎?

        public Option build()
        {
            if (opt == null && longOpt == null)
            {
                throw new IllegalArgumentException("Either opt or longOpt must be specified");
            }
            return new Option(this);
        }

然后就是直接復制過去,其實完全可以將Builder中的一些函數給Option中,不是嗎?

    private Option(final Builder builder)
    {
        this.argName = builder.argName;
        this.description = builder.description;
        this.longOpt = builder.longOpt;
        this.numberOfArgs = builder.numberOfArgs;
        this.opt = builder.opt;
        this.optionalArg = builder.optionalArg;
        this.required = builder.required;
        this.type = builder.type;
        this.valuesep = builder.valuesep;
    }

參考

Apache Commons CLI ?
Commons CLI使用詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容