1、简单而功能强大的commons CLI简单而功能强大的commons CLI 【一】需求前面我们使用了commons io包中的DirectoryWalker和IOFileFilter来进行复杂条件的搜索,但是这个程序有几个问题: 选项都是hard code在代码里面,难以修改 有些选项是必需的,有些选项是可选的 有些选项是不带参数的,有些选项是要带参数的如果我们希望这个程序能够更加灵活,根据人性化,那么我们需要提供一个界面,无论是普通的命令行、控制台交互、GUI界面。而且还必须让用户自行决定是否要使用该选项。程序必须自动根据已有的条件动态组合【二】简单而功能强大的commons CLIApa
2、che commons CLI是一个开源的,用于处理命令行的工具包。这个包目前的稳定版本是1.2,他非常简单只有20个左右的class,但提供了几乎所以可以用到的命令行功能。它的主页在这里:Apache commons CLI根据CLI的逻辑,每一个命令行的处理都可以分为3个步骤:定义、解析、交互 定义:定义命令行的各种选项属性(包括缩写、全写、是否必须、是否带参数、参数个数限制) 解析:使用解析器对命令行选项列表进行解析 交互:从解析好的命令行查询用户输入的参数值并进行处理这里需要区分两个名词:选项(option)和参数(arguments)。选项是用来表明功能或者参数的意思的,例如“-d”
3、这个字符串就是一个选项,它可以表示一个日期。那么如果我们需要指定一个日期用于处理,就需要在“-d”后面再加上一个具体值,这个具体值就是参数(argument)。对应于这3个过程,我们来认识几个重要的类:定义阶段 A.Option:这个类用于定义命令行的选项,你可以通过构造方法来定义一个选项 B.Options:Option的容器,用于存储多个Option C.OptionBuilder:使用描述性API来构建Option,而非直接使用Option的构造方法解析阶段 A.CommandLineParser:接口,定义了parse方法由实现类实现 B.PosixParser:Posix风格的命令行
4、解析器 C.GnuParser:GNU风格的命令行解析器交互阶段 A.CommandLine:解析后的命令行对象,可以用于查询选项的值【三】CLI快速入门通常情况下如果命令的选项比较简单我们使用构造方法就够了,但是当选项的属性比较复杂或者描述性文本比较长时,使用构建器会令到程序的可读性更进一步。下面我们来看看这个需求:有这样一个命令行,它具备如下的选项和参数组合: 一个目录选项:-d,带参数值,必须选项 一个日期选项:-D,带参数值,全写-date,可选项 一个日期范围选项:-r,带参数值,当-D出现时为必选项,否则该选项无效 一个文件名前缀选项:-p,带参数值,可以有多个前缀名,以逗号分隔,
5、可选项 一个文件扩展名选项:-s,带参数值,可以有多个扩展名,以逗号分隔,可选项 一个文件大小选项:-S,带参数值,全写-file-size,可选项 一个文件大小阀值选项:-l,带参数值,当-S出现时为必选项,否则该选项无效 一个帮助信息选项:-h,无参数值【四】代码示例package example.io;import mons.cli.CommandLine;import mons.cli.CommandLineParser;import mons.cli.HelpFormatter;import mons.cli.Option;import mons.cli.OptionBuilder;
6、import mons.cli.Options;import mons.cli.ParseException;import mons.cli.PosixParser;/* * <pre> * 用于指定各种搜索条件 * </pre> */public class SearchCommandLineProcesser implements CommandLineProcesser /* * <pre> * 一个目录选项:-d,带参数值,必须选项 * 一个日期选项:-D,带参数值,全写-date,可选项 * 一个日期范围选项:-r,带参数值,当-D出现时为必选项,
7、否则该选项无效 * 一个文件名前缀选项:-p,带参数值,可以有多个前缀名,以逗号分隔,可选项 * 一个文件扩展名选项:-s,带参数值,可以有多个扩展名,以逗号分隔,可选项 * 一个文件大小选项:-S,带参数值,全写-file-size,可选项 * 一个文件大小阀值选项:-l,带参数值,当-S出现时为必选项,否则该选项无效 * 一个帮助信息选项:-h,无参数值 * </pre>. */ private Options searchOpts = new Options(); private CommandLine cl = null; /* * The main method. * *
8、 param args the arguments */ public static void main(String args) SearchCommandLineProcesser processer = new SearchCommandLineProcesser(); processer.run(args); processer.validte(); /* * Instantiates a new search command line processer. */ public SearchCommandLineProcesser() String desc = Specify the
9、 directory where search start; Option optStartDir = OptionBuilder.withDescription(desc).isRequired(false) .hasArgs().withArgName(START_DIRECTORY).create(d); searchOpts.addOption(optStartDir); /* * Set rule for command line parser, run parsing process * * param args the args */ private void run(Strin
10、g args) setDate(); setDateRange(); setPrefix(); setSuffix(); setSize(); setSizeRange(); setHelp(); runProcess(searchOpts, args, new PosixParser(); /* * Sets the date. */ public void setDate() String desc = Specify the file create date time; Option optDate = OptionBuilder.withDescription(desc).isRequ
11、ired(false) .hasArgs().withArgName(FILE_CREATE_DATE).withLongOpt(date) .create(D); searchOpts.addOption(optDate); /* * Sets the date range. */ public void setDateRange() StringBuffer desc = new StringBuffer( Specify acceptance date range for cutoff date specify by option -d); desc.append(if true, ol
12、der files (at or before the cutoff); desc.append(are accepted, else newer ones (after the cutoff); Option optDateRange = null; optDateRange = OptionBuilder.withDescription(desc.toString() .isRequired(false).hasArg().withArgName(DATE_RANGE) .create(r); searchOpts.addOption(optDateRange); /* * Sets th
13、e prefix. */ public void setPrefix() String desc = Specify the prefix of file, multiple prefixes can be split by comma; Option optPrefix = OptionBuilder.withDescription(desc) .isRequired(false).hasArgs().withArgName(FILE_PREFIXES) .create(p); searchOpts.addOption(optPrefix); /* * Sets the suffix. */
14、 public void setSuffix() String desc = Specify the suffix of file, multiple suffixes can be split by comma; Option optSuffix = OptionBuilder.withDescription(desc) .isRequired(false).hasArgs().withArgName(FILE_SUFFIXES) .create(s); searchOpts.addOption(optSuffix); /* * Sets the size. */ public void setSize() String desc = Spcify the file size; Option optSize = OptionBuilder.withDescription(desc).isRequired(false) .hasArg().withArgName(FILE_SIZE_WITH_LONG_VALUE).withLongOpt( file-size).create(S); searchOpts.addOption(optSize); /* * Sets the size range. */ public void setSizeRange() String
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1