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. 分享腾讯云的Linux服务器连接速度很慢的解决心得(原创)

    最近发觉连接服务器非常慢,之前没有出现过这种情况. 我在这个腾讯云的服务器上弄了很多虚拟服务器,估计是数据量太大 造成了冗余数据较多的原因,咨询了下腾讯云的小哥, 给我了个明确的回复: 您反馈Xshe ...

  2. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集-补充-之安装iptables】

    1,安装完了jdk,tomcat,启动tomcat的bin/startup.sh后,发现在浏览器输入公网ip地址和tomcat的默认(server.xml)中的端口port:8080,无法访问,这主要 ...

  3. Service的启动过程

    --摘自<Android进阶解密> 第一步:ContextImpl到ActivityManagerService的调用过程 第二步:ActivityThread启动Service 1)Pr ...

  4. Python面向对象之魔术方法

    __str__ 改变对象的字符串显示.可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法 class Student: def __init__(self, name, a ...

  5. 如何避免OOM

    一.减小对象的内存占用 1)使用更加轻量的数据结构 例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构. ArrayMap和HashMap主要不同之处在于 ...

  6. configure: error: Cannot find php-config. Please use --with-php-config=PATH

    本文章给大家介绍configure: error: Cannot find php-config. Please use --with-php-config=PATH错误解决办法. configure ...

  7. ajax登录验证-js

    1.html代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. springboot 使用 swagger2

    段时间,同事分享了一下 swagger-ui,于是自己尝试了一下.大致的使用过程这里记录一下: 1.添加依赖 <!--swagger-ui--><dependency> < ...

  9. Java 获取当前日期的几种方法

    import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import ja ...

  10. CXF安装和配置时出现Exception in thread "main" java.lang.UnsupportedClassVersionError:异常?

    异常信息: C:\Users\>wsdl2java -h Exception in thread "main" java.lang.UnsupportedClassVersi ...