使用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库 ...
随机推荐
- IntelliJ IDEA编辑器光标定位错误的问题!
这几天我的IntelliJ IDEA编辑器总出现一个问题 打开一个项目文件后 点击文件内容无法获得输入光标,不能编辑文件 问题根源(个人): 因为近期本人测试项目时 在编辑器启动后,修改了本地时间 解 ...
- ios 在工程中使用字体
1.将字体拖入项目 2.在info.plist 文件中加入 3.使用 self.label.font = [UIFont fontWithName: @"FZ XingHei" s ...
- 一起学爬虫——PyQuery常用用法总结
什么是PyQuery PyQuery是一个类似于jQuery的解析网页工具,使用lxml操作xml和html文档,它的语法和jQuery很像.和XPATH,Beautiful Soup比起来,PyQu ...
- 咸鱼入门到放弃7--jsp<二>jsp常用标签
一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...
- CSS-Sass
什么是css预处理器
- webpack实现开发、测试、生产等环境的打包切换
使用webpack构建的工程,在开发过程中不同环境的配置不同,在各种环境的打包切换过程中需要手动修改相关配置达到预期目的.但是每次都手动修改会比较麻烦,本文简单介绍如何通过对webpack进行配置,实 ...
- Angularjs判断页面是否已经渲染结束(动态给标签长度)
相信大家都会碰到这样的问题.页面循环li.但是因为个数不知道.没有办法给li设置固定宽度.那么这时就需要动态计算数据长度并动态改变li的宽度 <!--周边信息--> <div cla ...
- Module(CP343-1)Advanced system error SDB generation Error in rule file or rule file not found
报这个故障的原因是因为安装目录下缺少三个 err文件.只要从好的目录下拷贝过来即可. C:\Program Files (x86)\SIEMENS\Step7\s7wbx\rul
- haskell实现简易计算器
> module Main where > import System.IO > import Data.Char > import Control.Monad > im ...
- 在页面上获取web项目信息
获取协议名称:request.getScheme() 获取域名:request.getServerName() 获取项目名称:request.getContextPath() 使用EL表达式获取项目名 ...