使用Apache commons-cli包进行命令行参数解析的示例代码
程序员文章站
2022-05-11 17:51:13
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包进行命令行参数解析的示例代码,希望对大家有所帮助