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的更多相关文章

  1. Apache Commons CLI官方文档翻译 —— 快速构建命令行启动模式

    昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册. 下面将会通过几个部分简单的介绍CLI在应用中的使用场景. 昨天已经联系过几个基本的命令行参数 ...

  2. Apache Commons CLI命令行启动

    今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式--比如可以从命令行启动,也可以从web端启动.今天就看看如何设计命令行启动... Apache Commons CLI Apac ...

  3. Apache Commons CLI 简介

    CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被 ...

  4. Apache Commons CLI 开发命令行工具示例

    概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...

  5. 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,这个包被间接的被其他 ...

  6. 使用 Apache Commons CLI 开发命令行工具示例

    Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...

  7. 使用 Apache Commons CLI 解析命令行参数示例

    很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...

  8. Commons CLI 学习(1)

    The Apache Commons CLI library provides an API for parsing command line options passed to programs. ...

  9. atitit.基于  Commons CLI 的命令行原理与 开发

    atitit.基于  Commons CLI 的命令行原理与 开发 1. 命令行支持的格式有以下几种: 1 2. json化,map化的命令行参数内部表示 1 3. Ati cli 2 4. CLI库 ...

随机推荐

  1. Eclipse安装git插件以及关联导入GitHub项目

    一.Eclipse配置git 1.查看自己eclipse的版本 打开eclipse 导航: help->AboutEclipse 如图: 2.检查Eclipse中是否已安装Git插件 菜单栏He ...

  2. eclise开发设置

    eclipse在debug模式下鼠标移动到变量上不显示值的问题 在eclipse中调试时,鼠标移动到变量上不显示值,使用ctrl+shift+i,或者通过配置达到目的:  Window->Pre ...

  3. LINQ 详解

    LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作 ...

  4. react-native项目中集成react-native-camera插件

    1. 安装 yarn add react-native-camera 2. 手动关联 (1)在AndroidManifest.xml中添加权限配置 <uses-permission androi ...

  5. 20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...

  6. ISP PIPLINE (三) BPC

    what is the Bad Pixel? 坏点为死点,也就是基本不随照度变化呈现光电线性转换的关系.表现为暗态常亮,亮态常暗. 坏点分类:静态坏点:亮坏点,暗坏点.                 ...

  7. js 把 json 转为以 ‘&’ 连接的字符串

    /** * URL编码; * @param {参数} param */ export function toParams(param) { var result = "" for ...

  8. MVC 程序在编译时提示 GAC与 Temporary ASP.NET Files目录内引用文件版本不一致

    今天在调试Mvc程序时,提示GAC与Temporary ASP.NET Files目录内引用文件版本不一致. [A]System.Web.WebPages.Razor.Configuration.Ho ...

  9. 报错!!!Servlet.service() for servlet [action] in context with path [/myssh] threw exception [java.lang.NullPointerException] with root cause java.lang.NullPointerException

    这个为什么报错啊~~ at com.hsp.basic.BasicService.executeQuery(BasicService.java:33) 这个对应的语句是   Query query = ...

  10. 转 MYSQL InnoDB Record, Gap, and Next-Key Locks

    http://dev.mysql.com/doc/refman/5.0/en/innodb-record-level-locks.html InnoDB has several types of re ...