使用commons.cli实现MyCP
Commons.cli库
考虑到这次的任务是实现自己的命令行命令cp,我认为简单地使用args[]无法很好的完成需求。经过网上的一番搜索,我找到Commons.cli库可以较好地处理命令行传参,于是我打算借助这次机会顺便掌握以下更高级的命令行传参。
首先从官网下载jar包,然后导入IDEA


因为我也是第一次接触这个包,不太熟悉,这是一些参考链接:Java命令行参数解析、使用 Apache Commons CLI 开发命令行工具示例,这是官方文档

最简单的使用需要以下类和方法



大概框架写出来是这样
public class MyCP {
public static void main(String[] args) {
// Create a Parser
CommandLineParser parser = new DefaultParser();
Option optiontx=new Option("tx","txt2bin",true,"Convert .txt to .bin");
optiontx.setArgs(2);//设置“-tx”选项固定参数数量为2
optiontx.setRequired(false);//“-tx”参数不是必选
Option optionxt=new Option("xt","bin2txt",true,"Convert .bin to .txt");
optionxt.setArgs(2);
optionxt.setRequired(false);
Options options = new Options();
options.addOption(optiontx);
options.addOption(optionxt);
File srcfile,dstfile;
try{
// Parse the program arguments
CommandLine commandLine = parser.parse(options, args);
// Set the appropriate variables based on supplied options
if(commandLine.hasOption("tx")) {
} else if (commandLine.hasOption("xt")) {
} else {
}
} catch (Exception e){
System.out.println(e.getMessage());
}
}
}
更多的操作可以去看文档
MyCP
要实现MyCP,具体的需求分析如下:
- 没有参数时实现复制文件
- 源文件必须为存在,目的文件可以是目录或文件
- 目的文件为路径时,在目的路径创建与源文件同名的文件;若目的路径是源文件所在路径,则退出程序并打印“filename is the same file with filename”(未完全解决目的文件为源文件的情况,目前想到可以尝试文件锁,但是还没有实施)
- 目的文件为文件名时,创建目的文件,内容为源文件的复制
- 参数为“-tx”时,将源文件中的十进制数字复制到目的文件并转为二进制
- 参数为“-xt”时,将源文件中的二进制数字复制到目的文件并转为十进制
具体代码参考码云链接,以上需求均已实现
测试代码
这次Junit较为复杂,因为测试的是main方法,所以在参考一些博客后使用这样的框架
@Test
public void testNoOpt() {
String[] args1 = {"1.txt", "2.txt"};
String[] args2 = {"1.txt", "src"};
MyCP.main(args1);
MyCP.main(args2);
try{
assertTrue();
assertTrue();
}catch (Exception e){
System.out.println(e.getMessage());
fail();
}
}
由因为测试时要测试复制出来的文件是否和源文件一样,所以在开始测试前需要初始化出源文件,这里使用@Before来进行预处理
@Before
public void init(){
File file = new File("1.txt");
File numFile = new File("number.txt");
File binaryFile = new File("binary.bin");
try{
file.createNewFile();
numFile.createNewFile();
binaryFile.createNewFile();
FileOutputStream output = new FileOutputStream(file);
output.write("MyCP works perfectly!!".getBytes());
output = new FileOutputStream(numFile);
output.write("10 a 9".getBytes());
output = new FileOutputStream(binaryFile);
output.write("1111 10 1001".getBytes());
}catch (Exception e){
System.out.println(e.getMessage());
}
}
具体代码见码云链接
由于这次时间比较紧迫,在本次的Junit测试中没有测试应该抛出的异常,但是我都通过直接运行的方式测试过了。这次Junit测试主要尝试以前没有试过的main方法测试和预处理。
最终测试结果如下

总结
其实像这样自己去学习新的东西,为了实现自己设定的需求,一步一步精益求精,遇到问题立刻着手去解决,一边做一边学习,这种学习方法我比较习惯。可能是因为还算感兴趣的原因,虽然已经很晚了,但是我还是想把自己的程序写完。其实现在我已经在思考为了这么一个小作业这么麻烦是不是有点吃力不讨好,但是不管怎么说,我已经付出了努力,哪怕写出来的东西幼稚让人笑话,这大概就是我在有限时间有限精力下能发挥的极限了。
最近因为打ctf比赛,很多本来可能做的个人项目,可以写的博客都没有写。我深刻感受到自己能力的有限,一方面ctf一窍不通,另一方面java赶不上来。不过我相信努力会有回报的,笨鸟先飞不是吗?我也恳请老师能指出我代码的不足或者走的方向有错,毕竟提高效率、及时总结纠错比蛮干有效多了。
使用commons.cli实现MyCP的更多相关文章
- Apache Commons CLI官方文档翻译 —— 快速构建命令行启动模式
昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册. 下面将会通过几个部分简单的介绍CLI在应用中的使用场景. 昨天已经联系过几个基本的命令行参数 ...
- Apache Commons CLI命令行启动
今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式--比如可以从命令行启动,也可以从web端启动.今天就看看如何设计命令行启动... Apache Commons CLI Apac ...
- Apache Commons CLI 简介
CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被 ...
- Apache Commons CLI 开发命令行工具示例
概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...
- The type org.apache.commons.cli.Options cannot be resolved. It is indirectly referenced from required .class files
在搭建好Hadoop Eclipse开发环境后,编写map-reduce,遇到如下的问题: 从字面上可以看出,工程缺少org.apache.commons.cli.Options,这个包被间接的被其他 ...
- 使用 Apache Commons CLI 开发命令行工具示例
Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...
- 使用 Apache Commons CLI 解析命令行参数示例
很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...
- Commons CLI 学习(1)
The Apache Commons CLI library provides an API for parsing command line options passed to programs. ...
- atitit.基于 Commons CLI 的命令行原理与 开发
atitit.基于 Commons CLI 的命令行原理与 开发 1. 命令行支持的格式有以下几种: 1 2. json化,map化的命令行参数内部表示 1 3. Ati cli 2 4. CLI库 ...
随机推荐
- 金蝶K3 WISE BOM多级展开_BOM成本表
/****** Object: StoredProcedure [dbo].[pro_bobang_BOMCost] Script Date: 07/29/2015 16:09:11 ******/ ...
- Javascript我学之三函数的参数
本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘 函数的参数 对于参数值,JavaScript不会进行类型检查,任何类型的值都可以被传递给参数. ...
- Redis数据结构之intset(2)
本文及后续文章,Redis版本均是v3.2.8 上文我们说到intset整型集合的数据结构定义即元素的添加和查询操作,本文我们来看下Redis暴露给外面使用的Set集合,先通过一些基本的命令回顾下se ...
- 实时流式计算框架——JStorm
1.本地调试 a.步骤:生成Topology——实现Spout接口——实现Bolt接口——编译运行 b.加入依赖 <!-- JStorm --> <dependency> &l ...
- es6中的...三个点
...是es6中新添加的操作符,可以称为spread或rest 定义一个数组 let name=['小红','小明','小白']; 我们在控制台输出 console.log(name); 结果: ...
- 网络流之最大流Dinic算法模版
/* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...
- 51nod 1387 移数字
任意门 回来拉模版的时候意外发现这个题还没写题解,所以就随便补点吧. 题意其实就是要你求n的阶乘在模意义下的值. 首先找出来一个最大的$m$满足$m^2<=n$,对于大于$m^2$部分的数我们直 ...
- laravel之构造器操作数据库
使用构造器来查询的优点是可以方式sql注入 1.插入 2.修改数据库 3.删除 4.查询
- Oracle 索引 index
索引是一个模式对象,其中包含每个值的条目,该条目出现在表或集群的索引列中,并提供对行的直接快速访问. 创建一个索引: create index 索引名 on 表名 (字段名); 删除索引: dro ...
- Git飞行规则
原文链接 Git飞行规则(Flight Rules)