简单而功能强大的commons CLI.docx
《简单而功能强大的commons CLI.docx》由会员分享,可在线阅读,更多相关《简单而功能强大的commons CLI.docx(9页珍藏版)》请在冰豆网上搜索。
![简单而功能强大的commons CLI.docx](https://file1.bdocx.com/fileroot1/2022-10/24/6fad8e40-3acb-4eb1-b04d-b65d4112da60/6fad8e40-3acb-4eb1-b04d-b65d4112da601.gif)
简单而功能强大的commonsCLI
简单而功能强大的commonsCLI
【一】需求前面我们使用了commonsio包中的DirectoryWalker和IOFileFilter来进行复杂条件的搜索,但是这个程序有几个问题:
①选项都是hardcode在代码里面,难以修改
②有些选项是必需的,有些选项是可选的
③有些选项是不带参数的,有些选项是要带参数的如果我们希望这个程序能够更加灵活,根据人性化,那么我们需要提供一个界面,无论是普通的命令行、控制台交互、GUI界面。
而且还必须让用户自行决定是否要使用该选项。
程序必须自动根据已有的条件动态组合【二】简单而功能强大的commonsCLIApachecommonsCLI是一个开源的,用于处理命令行的工具包。
这个包目前的稳定版本是1.2,他非常简单只有20个左右的class,但提供了几乎所以可以用到的命令行功能。
它的主页在这里:
ApachecommonsCLI根据CLI的逻辑,每一个命令行的处理都可以分为3个步骤:
定义、解析、交互
①定义:
定义命令行的各种选项属性(包括缩写、全写、是否必须、是否带参数、参数个数限制)
②解析:
使用解析器对命令行选项列表进行解析
③交互:
从解析好的命令行查询用户输入的参数值并进行处理这里需要区分两个名词:
选项(option)和参数(arguments)。
选项是用来表明功能或者参数的意思的,例如“-d”这个字符串就是一个选项,它可以表示一个日期。
那么如果我们需要指定一个日期用于处理,就需要在“-d”后面再加上一个具体值,这个具体值就是参数(argument)。
对应于这3个过程,我们来认识几个重要的类:
①定义阶段
A.Option:
这个类用于定义命令行的选项,你可以通过构造方法来定义一个选项
B.Options:
Option的容器,用于存储多个Option
C.OptionBuilder:
使用描述性API来构建Option,而非直接使用Option的构造方法②解析阶段
A.CommandLineParser:
接口,定义了parse方法由实现类实现
B.PosixParser:
Posix风格的命令行解析器
C.GnuParser:
GNU风格的命令行解析器③交互阶段
A.CommandLine:
解析后的命令行对象,可以用于查询选项的值【三】CLI快速入门通常情况下如果命令的选项比较简单我们使用构造方法就够了,但是当选项的属性比较复杂或者描述性文本比较长时,使用构建器会令到程序的可读性更进一步。
下面我们来看看这个需求:
有这样一个命令行,它具备如下的选项和参数组合:
①一个目录选项:
-d,带参数值,必须选项
②一个日期选项:
-D,带参数值,全写--date,可选项
③一个日期范围选项:
-r,带参数值,当-D出现时为必选项,否则该选项无效
④一个文件名前缀选项:
-p,带参数值,可以有多个前缀名,以逗号分隔,可选项
⑤一个文件扩展名选项:
-s,带参数值,可以有多个扩展名,以逗号分隔,可选项
⑥一个文件大小选项:
-S,带参数值,全写--file-size,可选项
⑦一个文件大小阀值选项:
-l,带参数值,当-S出现时为必选项,否则该选项无效
⑧一个帮助信息选项:
-h,无参数值【四】代码示例packageexample.io;importmons.cli.CommandLine;
importmons.cli.CommandLineParser;
importmons.cli.HelpFormatter;
importmons.cli.Option;
importmons.cli.OptionBuilder;
importmons.cli.Options;
importmons.cli.ParseException;
importmons.cli.PosixParser;/**
*<pre>
*用于指定各种搜索条件
*</pre>
*/
publicclassSearchCommandLineProcesserimplementsCommandLineProcesser{/**
*<pre>
*①一个目录选项:
-d,带参数值,必须选项
*②一个日期选项:
-D,带参数值,全写--date,可选项
*③一个日期范围选项:
-r,带参数值,当-D出现时为必选项,否则该选项无效
*④一个文件名前缀选项:
-p,带参数值,可以有多个前缀名,以逗号分隔,可选项
*⑤一个文件扩展名选项:
-s,带参数值,可以有多个扩展名,以逗号分隔,可选项
*⑥一个文件大小选项:
-S,带参数值,全写--file-size,可选项
*⑦一个文件大小阀值选项:
-l,带参数值,当-S出现时为必选项,否则该选项无效
*⑧一个帮助信息选项:
-h,无参数值
*</pre>.
*/privateOptionssearchOpts=newOptions();privateCommandLinecl=null;/**
*Themainmethod.
*
*@paramargsthearguments
*/
publicstaticvoidmain(String[]args){
SearchCommandLineProcesserprocesser=newSearchCommandLineProcesser();
processer.run(args);
processer.validte();
}/**
*Instantiatesanewsearchcommandlineprocesser.
*/
publicSearchCommandLineProcesser(){
Stringdesc="Specifythedirectorywheresearchstart";
OptionoptStartDir=OptionBuilder.withDescription(desc).isRequired(false)
.hasArgs().withArgName("START_DIRECTORY").create('d');
searchOpts.addOption(optStartDir);
}/**
*Setruleforcommandlineparser,runparsingprocess
*
*@paramargstheargs
*/
privatevoidrun(String[]args){
setDate();
setDateRange();
setPrefix();
setSuffix();
setSize();
setSizeRange();
setHelp();
runProcess(searchOpts,args,newPosixParser());
}/**
*Setsthedate.
*/
publicvoidsetDate(){
Stringdesc="Specifythefilecreatedatetime";
OptionoptDate=OptionBuilder.withDescription(desc).isRequired(false)
.hasArgs().withArgName("FILE_CREATE_DATE").withLongOpt("date")
.create('D');
searchOpts.addOption(optDate);
}/**
*Setsthedaterange.
*/
publicvoidsetDateRange(){
StringBufferdesc=newStringBuffer(
"Specifyacceptancedaterangeforcutoffdatespecifybyoption-d");
desc.append("iftrue,olderfiles(atorbeforethecutoff)");
desc.append("areaccepted,elsenewerones(afterthecutoff)");
OptionoptDateRange=null;optDateRange=OptionBuilder.withDescription(desc.toString())
.isRequired(false).hasArg().withArgName("DATE_RANGE")
.create('r');
searchOpts.addOption(optDateRange);
}/**
*Setstheprefix.
*/
publicvoidsetPrefix(){
Stringdesc="Specifytheprefixoffile,multipleprefixescanbesplitbycomma";
OptionoptPrefix=OptionBuilder.withDescription(desc)
.isRequired(false).hasArgs().withArgName("FILE_PREFIXES")
.create('p');
searchOpts.addOption(optPrefix);
}/**
*Setsthesuffix.
*/
publicvoidsetSuffix(){
Stringdesc="Specifythesuffixoffile,multiplesuffixescanbesplitbycomma";
OptionoptSuffix=OptionBuilder.withDescription(desc)
.isRequired(false).hasArgs().withArgName("FILE_SUFFIXES")
.create('s');
searchOpts.addOption(optSuffix);
}/**
*Setsthesize.
*/
publicvoidsetSize(){
Stringdesc="Spcifythefilesize";
OptionoptSize=OptionBuilder.withDescription(desc).isRequired(false)
.hasArg().withArgName("FILE_SIZE_WITH_LONG_VALUE").withLongOpt(
"file-size").create('S');
searchOpts.addOption(optSize);
}/**
*Setsthesizerange.
*/
publicvoidsetSizeRange(){
String