使用Apache commons-cli包进行命令行参数解析的示例代码
Apache的commons-cli包是专门用于解析命令行参数格式的包。
依赖:
commons-cli commons-cli 1.3.1
使用此包需要:
1.先定义有哪些参数需要解析、哪些参数有额外的选项、每个参数的描述等等,对应Options类
比如说一个命令行参数是-hfbv,我们定义的Options的目的是,说明哪些参数是真正需要解析的参数:如我们定义了Option:h、f、b,那么在解析的时候解析器就可以知道怎么去用定义的Option匹配命令行从而获取每个参数。而且可以定义哪些参数需要选项,如tar-f,f参数就需要文件名选项,通过定义解析器才可以把f后面的内容解析为f指定的文件名。
2.根据定义的需要解析的参数对命令行参数进行解析,对应CommandLineParser类
根据定义的Options对象去解析传入的String[]argus参数,从而匹配出每个参数,然后我们就可以单独获取每个参数。
3.解析完成返回CommandLine对象,由这个对象可获取此次命令行参数的信息。
可以从这个对象中知道哪些参数输入了,哪些参数没有输入,哪些参数的额外选项的内容等等。然后我们就能自己写代码根据不同参数执行不同逻辑了。
示例代码:
importjava.io.File;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.HashSet;
importorg.apache.commons.cli.CommandLine;
importorg.apache.commons.cli.CommandLineParser;
importorg.apache.commons.cli.DefaultParser;
importorg.apache.commons.cli.HelpFormatter;
importorg.apache.commons.cli.Option;
importorg.apache.commons.cli.Options;
importorg.apache.commons.cli.ParseException;
importcom.lwt.util.DirUtil;
publicclassCommandLineUtil{
privateString[]args;
privateOptionsopts=newOptions();
privateFilekeyFile;
privatebooleanencrypt;
privatebooleancreate;
privatebooleanenName;
privateFile[]files;
privateFile[]dirs;
publicFilegetKeyFile(){
returnkeyFile;
}
publicbooleanisEncrypt(){
returnencrypt;
}
publicbooleanisEnName(){
returnenName;
}
publicbooleanisCreate(){
returncreate;
}
publicFile[]getFiles(){
returnfiles;
}
publicFile[]getDirs(){
returndirs;
}
publicCommandLineUtil(String[]args){
this.args=args;
definedOptions();
parseOptions();
duplicate_removal();
}
//定义命令行参数
privatevoiddefinedOptions(){
Optionopt_h=newOption("h","Showthispage.");
Optionopt_e=newOption("e","encrypt",false,"Encryptfile.");
Optionopt_d=newOption("d","decrypt",false,"Decryptfile.");
Optionopt_c=newOption("c","create",false,"Createnewkeyfile.");
Optionopt_n=newOption("n","name",false,"Encryptfilename.");
Optionopt_k=Option.builder("k").hasArg().argName("keyFile")
.desc("Specifythekeyfile").build();
Optionopt_f=Option.builder("f").hasArgs().argName("file1,file2...")
.valueSeparator(',')
.desc("Afileslistwith','separatetohandle").build();
Optionopt_r=Option
.builder("r")
.hasArgs()
.argName("dir1,dir1...")
.valueSeparator(',')
.desc("Adirectorieslistwith','separatetohandleitschildfiles")
.build();
Optionopt_R=Option
.builder("R")
.hasArgs()
.argName("dir1,dir1...")
.valueSeparator(',')
.desc("Adirectorieslistwith','separatetorecursehandlechildfiles")
.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);
}
//解析处理命令行参数
privatevoidparseOptions(){
CommandLineParserparser=newDefaultParser();
CommandLineline=null;
//解析命令行参数
try{
line=parser.parse(opts,args);
}catch(ParseExceptione){
System.err.println(e.getMessage());
System.exit(1);
}
//若指定h则显示帮助
if(args==null||args.length==0||line.hasOption("h")){
HelpFormatterhelp=newHelpFormatter();
help.printHelp("encrypt",opts);
}
//选择加密或解密操作,默认是加密文件
if(line.hasOption("d")){
if(line.hasOption("e")){
System.err
.println("The-eand-doptioncan'tspecifyatthesametime.");
System.exit(1);
}
encrypt=false;
}else{
encrypt=true;
if(line.hasOption("n")){
enName=true;
}
}
if(line.hasOption("k")){
Stringk=line.getOptionValue("k");
Filefile=newFile(k);
if(line.hasOption("c")){
keyFile=file;
create=true;
}else{
if(file.isFile()){
keyFile=file;
}else{
System.err.println(file+"isnotaavailablekeyfile");
System.exit(1);
}
}
}
ArrayListfiles=newArrayList();
ArrayListdirs=newArrayList();
if(line.hasOption("f")){
String[]fs=line.getOptionValues("f");
for(Stringf:fs){
Filefile=newFile(f);
if(file.isFile()){
files.add(file);
}else{
System.err.println(file+"isnotafile");
System.exit(1);
}
}
}
if(line.hasOption("r")){
String[]rs=line.getOptionValues("r");
for(Stringr:rs){
Filedir=newFile(r);
if(dir.isDirectory()){
dirs.add(dir);
DirUtildirUtil=newDirUtil(dir);
files.addAll(Arrays.asList(dirUtil.getFiles()));
dirs.addAll(Arrays.asList(dirUtil.getDirs()));
}else{
System.err.println(dir+"isnotadirectory");
System.exit(1);
}
}
}
if(line.hasOption("R")){
String[]Rs=line.getOptionValues("R");
for(StringR:Rs){
Filedir=newFile(R);
if(dir.isDirectory()){
dirs.add(dir);
DirUtildirUtil=newDirUtil(dir);
files.addAll(Arrays.asList(dirUtil.getAllFiles()));
dirs.addAll(Arrays.asList(dirUtil.getAllDirs()));
}else{
System.err.println(dir+"isnotadirectory");
System.exit(1);
}
}
}
this.files=files.toArray(newFile[0]);
this.dirs=dirs.toArray(newFile[0]);
}
publicvoidduplicate_removal(){
HashSetfileSet=newHashSet();
for(Filefile:files){
try{
fileSet.add(file.getCanonicalFile());
}catch(IOExceptione){
System.err.println(e.getMessage());
System.exit(1);
}
}
files=fileSet.toArray(newFile[0]);
fileSet=newHashSet();
for(Filedir:dirs){
try{
fileSet.add(dir.getCanonicalFile());
}catch(IOExceptione){
System.err.println(e.getMessage());
System.exit(1);
}
}
dirs=fileSet.toArray(newFile[0]);
}
}
总结
以上所述是小编给大家介绍的使用Apachecommons-cli包进行命令行参数解析的示例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。