欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

使用Apache commons-cli包进行命令行参数解析的示例代码

程序员文章站 2022-10-17 22:56:47
apache的commons-cli包是专门用于解析命令行参数格式的包。  依赖:

apache的commons-cli包是专门用于解析命令行参数格式的包。

 依赖:

<dependency>
  <groupid>commons-cli</groupid>
  <artifactid>commons-cli</artifactid>
  <version>1.3.1</version>
</dependency>

使用此包需要:

1.先定义有哪些参数需要解析、哪些参数有额外的选项、每个参数的描述等等,对应options类
 比如说一个命令行参数是 -hfbv,我们定义的options的目的是,说明哪些参数是真正需要解析的参数:如我们定义了option:h、f、b,那么在解析的时候解析器就可以知道怎么去用定义的option匹配命令行从而获取每个参数。而且可以定义哪些参数需要选项,如tar -f ,f参数就需要文件名选项,通过定义解析器才可以把f后面的内容解析为f指定的文件名。

2.根据定义的需要解析的参数对命令行参数进行解析,对应commandlineparser类
 根据定义的options对象去解析传入的string[] argus参数,从而匹配出每个参数,然后我们就可以单独获取每个参数。

3.解析完成返回commandline对象,由这个对象可获取此次命令行参数的信息。
 可以从这个对象中知道哪些参数输入了,哪些参数没有输入,哪些参数的额外选项的内容等等。然后我们就能自己写代码根据不同参数执行不同逻辑了。

示例代码:

import java.io.file;
import java.io.ioexception;
import java.util.arraylist;
import java.util.arrays;
import java.util.hashset;​
import org.apache.commons.cli.commandline;
import org.apache.commons.cli.commandlineparser;
import org.apache.commons.cli.defaultparser;
import org.apache.commons.cli.helpformatter;
import org.apache.commons.cli.option;
import org.apache.commons.cli.options;
import org.apache.commons.cli.parseexception;​
import com.lwt.util.dirutil;​
public class commandlineutil {
  private string[] args;
  private options opts = new options();
  private file keyfile;
  private boolean encrypt;
  private boolean create;
  private boolean enname;
  private file[] files;
  private file[] dirs;
  public file getkeyfile() {
    return keyfile;
  }
  public boolean isencrypt() {
    return encrypt;
  }
  public boolean isenname() {
    return enname;
  }
  public boolean iscreate() {
    return create;
  }
  public file[] getfiles() {
    return files;
  }
  public file[] getdirs() {
    return dirs;
  }
​
  public commandlineutil(string[] args) {
    this.args = args;
    definedoptions();
    parseoptions();
    duplicate_removal();
  }
  // 定义命令行参数
  private void definedoptions(){
    option opt_h = new option("h", "show this page.");
    option opt_e = new option("e", "encrypt", false, "encrypt file.");
    option opt_d = new option("d", "decrypt", false, "decrypt file.");
    option opt_c = new option("c", "create", false, "create new key file.");
    option opt_n = new option("n", "name", false, "encrypt file name.");
    option opt_k = option.builder("k").hasarg().argname("keyfile")
        .desc("specify the key file").build();
    option opt_f = option.builder("f").hasargs().argname("file1,file2...")
        .valueseparator(',')
        .desc("a files list with ',' separate to handle").build();
    option opt_r = option
        .builder("r")
        .hasargs()
        .argname("dir1,dir1...")
        .valueseparator(',')
        .desc("a directories list with ',' separate to handle its child files")
        .build();
    option opt_r = option
        .builder("r")
        .hasargs()
        .argname("dir1,dir1...")
        .valueseparator(',')
        .desc("a directories list with ',' separate to recurse handle child files")
        .build();
    opts.addoption(opt_n);
    opts.addoption(opt_c);
    opts.addoption(opt_k);
    opts.addoption(opt_h);
    opts.addoption(opt_e);
    opts.addoption(opt_d);
    opts.addoption(opt_f);
    opts.addoption(opt_r);
    opts.addoption(opt_r);
  }
  // 解析处理命令行参数
  private void parseoptions(){
    commandlineparser parser = new defaultparser();
    commandline line = null;
    // 解析命令行参数
    try {
      line = parser.parse(opts, args);
    } catch (parseexception e) {
      system.err.println(e.getmessage());
      system.exit(1);
    }
​
    // 若指定h则显示帮助
    if (args == null || args.length == 0 || line.hasoption("h")) {
      helpformatter help = new helpformatter();
      help.printhelp("encrypt", opts);
    }
​
    // 选择加密或解密操作,默认是加密文件
    if (line.hasoption("d")) {
      if (line.hasoption("e")) {
        system.err
            .println("the -e and -d option can't specify at the same time.");
        system.exit(1);
      }
      encrypt = false;
    } else {
      encrypt = true;
      if(line.hasoption("n")){
        enname = true;
      }
    }
    if (line.hasoption("k")) {
      string k = line.getoptionvalue("k");
      file file = new file(k);
      if (line.hasoption("c")) {
        keyfile = file;
        create = true;
      }else {
        if(file.isfile()){
          keyfile = file;
        } else{
          system.err.println(file + " is not a available key file");
          system.exit(1);
        }
      }
    }
​
    arraylist<file> files = new arraylist<file>();
    arraylist<file> dirs = new arraylist<file>();
    if (line.hasoption("f")) {
      string[] fs = line.getoptionvalues("f");
      for(string f : fs){
        file file = new file(f);
        if(file.isfile()){
          files.add(file);
        }else{
          system.err.println(file + " is not a file");
          system.exit(1);
        }
      }
    }
​
    if (line.hasoption("r")) {
      string[] rs = line.getoptionvalues("r");
      for(string r : rs){
        file dir = new file(r);
        if(dir.isdirectory()){
          dirs.add(dir);
          dirutil dirutil = new dirutil(dir);
          files.addall(arrays.aslist(dirutil.getfiles()));
          dirs.addall(arrays.aslist(dirutil.getdirs()));
        }else{
          system.err.println(dir + " is not a directory");
          system.exit(1);
        }
      }
    }
​
    if (line.hasoption("r")) {
      string[] rs = line.getoptionvalues("r");
      for(string r : rs){
        file dir = new file(r);
        if(dir.isdirectory()){
          dirs.add(dir);
          dirutil dirutil = new dirutil(dir);
          files.addall(arrays.aslist(dirutil.getallfiles()));
          dirs.addall(arrays.aslist(dirutil.getalldirs()));
        }else{
          system.err.println(dir + " is not a directory");
          system.exit(1);
        }
      }
    }
    this.files = files.toarray(new file[0]);
    this.dirs = dirs.toarray(new file[0]);
  }
  public void duplicate_removal (){
    hashset<file> fileset = new hashset<file>();
    for(file file : files){
      try {
        fileset.add(file.getcanonicalfile());
      } catch (ioexception e) {
        system.err.println(e.getmessage());
        system.exit(1);
      }
    }
    files = fileset.toarray(new file[0]);
    fileset = new hashset<file>();
    for(file dir : dirs){
      try {
        fileset.add(dir.getcanonicalfile());
      } catch (ioexception e) {
        system.err.println(e.getmessage());
        system.exit(1);
      }
    }
    dirs = fileset.toarray(new file[0]);
  }
}

总结

以上所述是小编给大家介绍的使用apache commons-cli包进行命令行参数解析的示例代码,希望对大家有所帮助