Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          制作命令行程序

          Posted on 2009-12-11 23:22 啥都寫點 閱讀(864) 評論(0)  編輯  收藏 所屬分類: J2SE

          Apache組織的cli項目專門用于解決命令行參數的解析問題。使用cli項目的類庫的關鍵技術點如下:

             •  命令行的每個參數選項都是一個org.apache.commons.cli.Option對象,命令行的所有參數選項的Option對象都放入org.apache.commons.cli.Options中。
             •  類org.apache.commons.cli.CommandLineParser命令行解析器的基類,它的一個具體實現類是org.apache.commons.cli.BasicParser,通過它的parse方法 能將輸入的參數根據命令行參數選項進行解析,得到一個org.apache.commons.cli.CommandLine對象。
             •  CommandLine對象把輸入的命令行參數封裝起來,提供相應的檢測和訪問參數的方法。 

             •  org.apache.commons.cli.HelpFormatter 類用于格式化輸出命令行程序的幫助信息。

          /**-------------------------------BaseConsoleClient-----------------------------------*/
          package book.string.console;

          import org.apache.commons.cli.BasicParser;
          import org.apache.commons.cli.CommandLine;
          import org.apache.commons.cli.CommandLineParser;
          import org.apache.commons.cli.HelpFormatter;
          import org.apache.commons.cli.Option;
          import org.apache.commons.cli.OptionBuilder;
          import org.apache.commons.cli.Options;

          /**
           * 命令行程序的基類,是一個抽象類
           * 采用了Apache組織的命令行解析器的包
           
          */

          public abstract class BaseConsoleClient {
              
          /**幫助選項,參數為-h或者--help,功能描述為Displays help */
              
          private static final Option HELP =
                  OptionBuilder.withDescription(
          "Displays help")
                  .withLongOpt(
          "help")
                  .create(
          "h");
              
          /** debug選項,是否打印調試信息     */
              
          public static final Option DEBUG = new Option("debug""Enables debug mode");

              
          // 命令的參數選項
              private Options options = new Options();
              
          // 命令的幫助信息
              private String usageMsg;
              
          // 命令的頭信息
              private String header;
              
          //是否debug
              private boolean debugMode; 
              
          /**
               * 默認構造函數
               
          */

              
          protected BaseConsoleClient(){
                  
          //不打印debug信息
                  debugMode = false;
                  
          //將幫助和調試選項添加到命令的參數選項中
                  options.addOption(HELP);
                  options.addOption(DEBUG);
                  
          //默認幫助信息是類名
                  usageMsg = getClass().getName();
              }

              
              
          /**
               * 增加一個命令的參數選項
               * 
          @param option
               
          */

              
          protected void addOption(Option option){
                  
          this.options.addOption(option);
              }

              
              
          protected void setUsageMsg(String msg){
                  
          this.usageMsg = msg;
              }

              
              
          protected void setHeader(String header){
                  
          this.header = header;
              }

              
              
          /**
               * 顯示幫助信息
               
          */

              
          public void displayUsage(){
                  HelpFormatter formatter 
          = new HelpFormatter();
                  String header 
          = (this.header == null?
                          
          "Options:" : this.header;
                  formatter.printHelp(usageMsg, header, options, 
          nullfalse);
              }

              
              
          /**
               * 解析命令行參數
               * 
          @param args
               * 
          @return
               * 
          @throws Exception
               
          */

              
          public CommandLine parse(String[] args) throws Exception{
                  
          //新建一個命令行解析器
                  CommandLineParser parser = new BasicParser();
                  
          //用解析器解析命令行參數
                  CommandLine line = parser.parse(options, args);
                  
          //如果命令行中有-h,則打印幫助信息,并退出
                  if (line.hasOption("h")){
                      displayUsage();
                      System.exit(
          0);
                  }
                
                  
          if (line.hasOption("debug")){
                      
          this.debugMode = true;
                  }

                  
          return line;        
              }

              
              
          public boolean isDebugMode(){
                  
          return this.debugMode;    
              }

          }


          /**-------------------------------------SayHello.java----------------------------------------------*/

          package book.string.console;

          import org.apache.commons.cli.CommandLine;
          import org.apache.commons.cli.Option;
          import org.apache.commons.cli.OptionBuilder;

          public class SayHello extends BaseConsoleClient {

              
          private static final String SAYHELLO_COMMAND = "SayHello";
              
          private static final String SAYHELLO_USAGE = SAYHELLO_COMMAND;

              
          private static final Option NAME =
                  OptionBuilder.withDescription(
          "The name of the person. This argument is required.").hasArg()
                  .withLongOpt(
          "name")
                  .create(
          "n");    
                
              
          public static void main(String[] args){
                  
                  String name 
          = null;
                  
                  SayHello client 
          = new SayHello();
                  client.addOption(NAME);

                  client.setUsageMsg(SAYHELLO_USAGE);
                  client.setHeader(
          "Options:");
                  
                  
          try {
                      CommandLine line 
          = client.parse(args);
                      
          if (line.hasOption("n")){
                          name 
          = line.getOptionValue("n");
                      }
           else {
                          System.err.println(
          "Error: missing -n arguments.");
                          System.err.println(
          "Try '" + SAYHELLO_COMMAND 
                                  
          + " -h' for more information.");
                          System.exit(
          1);
                      }

                     
                  }
           catch (Exception e){
                      
          if (client.isDebugMode()){
                          e.printStackTrace();
                      }
           else {
                          System.err.println(
          "Error: " + e.getMessage());
                      }

                      System.exit(
          1);
                  }

                  System.out.println(
          "Hello, " + name + "!");
              }

          }







                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 五原县| 揭西县| 栾城县| 北流市| 阜新市| 宣武区| 阜宁县| 类乌齐县| 惠州市| 万全县| 壶关县| 兴海县| 寿光市| 托克托县| 大同市| 额尔古纳市| 镇原县| 呼和浩特市| 莒南县| 三亚市| 南岸区| 九龙坡区| 安国市| 嵊州市| 徐汇区| 香港| 通州区| 石河子市| 门头沟区| 施甸县| 巴中市| 博爱县| 文安县| 绵阳市| 顺平县| 凤冈县| 花莲县| 应城市| 屏东县| 阜平县| 怀化市|