使用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 (); ArrayList dirs=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(){ HashSet fileSet=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。