文章目录

  • 1 简介
  • 2 参数格式定义
  • 3 类功能介绍
    • 3.1 初始化
    • 3.2 主要函数
  • 4 源代码
  • 5 输出结果
  • 6 小结

1 简介

在前文中,介绍了一个Python中的 argparse.ArgumentParser 类,能够实现对命令行输入参数的控制。搜索了一下,发现在Java中并没有提供相应的类。因此,为了在Java实现类似的功能,本文编写了一种用于处理main函数中的输入参考 String[] args 的类 ArgumentsParser

2 参数格式定义

首先,对参数进行定义。一般而言,命令行中的输入参数通用由多个由空格隔开,带有横杠(-)、键值(key)和值域(value)组成,每个标签格式如下所示:
-key str1 str2,比如 -path ./src ./data
多个标签间也使用空格隔开,以下是一条Java的编码示例:
javac -encoding utf8 -t -d ./bin -cp /Users/hao/servlet-api.jar ./src/*.java
其中就包括了三组标签:

  1. -encoding utf8
  2. -t
  3. -d ./bin
  4. -cp /Users/hao/servlet-api.jar ./src/*.java

其中标签2的参数个数为0,标签1,3为1,标签4的参数个数为4。

3 类功能介绍

3.1 初始化

本类使用 String[] args 作为初始化化函数:
ArgumentsParser ap = new ArgumentsParser(args);
其中 args 就是 main 函数传递进来的所有参数。

3.2 主要函数

类中的主要非静态函数的作用如下:

函数名称 作用
boolean hasKey(String key) 判断key是否存在。
Set getKeys() 返回所有的Key。
String getString(String key) 返回指定key的字符串值,如果有多个值,只返回第1个值。
String getString(String key, String defaultValue) 返回指定key的字符串值(只返回第1个值),如果不存在则返回缺省值 defaultValue。
String[] getStrings(String key) 返回指定key的所有值列表。
int getInt(String key) 返回指定key的对应的整型,如果转换失败会抛出转换失败异常。

4 源代码

import java.util.HashMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;public class ArgumentsParser {public static void main(String args[]) {// for testargs = "-encoding utf8 -t -print 5 -d ./bin -cp /Users/hao/servlet-api.jar ./src/*.java".split(" ");ArgumentsParser ap = new ArgumentsParser(args);System.out.println("---------- Basic Test ---------");String name = ap.getString("encoding");int prints = Integer.parseInt(ap.getString("print"));for (String path : ap.getStrings("paths"))System.out.println(path);String out_path = ap.hasKey("out") ? ap.getString("out") : "c:\\output";System.out.println("Output Path: " + out_path);System.out.println("---------- Get Argument Strings ---------");for (String name1 : ap.getKeys())System.out.println(name1 + ": " + ap.getStrings(name1).length);System.out.println("---------- Key Existance Check ---------");System.out.println("hasKey(\"encoding\"): " + ap.hasKey("test"));System.out.println("hasKey(\"name\"): " + ap.hasKey("name"));System.out.println("hasKey(\"cp\"): " + ap.hasKey("path"));System.out.println("hasKey(\"d\"): " + ap.hasKey("paths"));System.out.println("---------- use arguments ---------");for (int i = 0; i < prints; i++) {System.out.print(name + ", ");}}HashMap<String, List<String>> map = new HashMap<>();ArgumentsParser(String arguments[]) {List<String> args = Arrays.asList(arguments);for (String arg : args) {// case 1: non-hyphen started arguments.if (!arg.startsWith("-"))continue;// case 2: tags with 0 argument values.String key = arg.substring(1);int arg_index = args.indexOf(arg);if (arg_index == args.size() - 1 || args.get(arg_index + 1).startsWith("-")) {map.put(key, new ArrayList<String>());continue;}// case 3: key with 1 or more argument valuesList<String> argstrs = new ArrayList<>();int i = 1;while (arg_index + i != args.size() && !args.get(arg_index + i).startsWith("-")) {argstrs.add(args.get(arg_index + i));i++;}map.put(arg.replace("-", ""), argstrs);}}public boolean hasKey(String keyName) {if (map.containsKey(keyName))return true;return false;}// Return argument namespublic Set<String> getKeys() {return map.keySet();}public String getString(String keyName) {return getString(keyName, null);}public String getString(String keyName, String defaultValue) {return this.hasKey(keyName) ? map.get(keyName).get(0) : defaultValue;}public String[] getStrings(String argumentName) {if (map.containsKey(argumentName))return map.get(argumentName).toArray(new String[0]);elsereturn new String[0];}public int getInt(String keyName, int defaultValue) {int retValue = 0;try {if (hasKey(keyName))retValue = Integer.parseInt(map.get(keyName).get(0));} catch (Exception ex) {retValue = defaultValue;}return retValue;}
}

5 输出结果

---------- Basic Test ---------
Output Path: c:\output
---------- Get Argument Strings ---------
print: 1
t: 0
d: 1
encoding: 1
cp: 2
---------- Key Existance Check ---------
hasKey("encoding"): false
hasKey("name"): false
hasKey("cp"): false
hasKey("d"): false
---------- use arguments ---------
utf8, utf8, utf8, utf8, utf8,

6 小结

通过本类的定义,可以方便地对命令行输入的参数进行提取,从而为后续的参数处理带来便利。

一个自建的Java命令行解析参数类ArgumentsParser相关推荐

  1. java 命令行 解析_如何在Java中解析命令行参数?

    小编典典 例如,这是你commons-cli用来解析2个字符串参数的方法: import org.apache.commons.cli.*; public class Main { public st ...

  2. Java 命令行运行参数大全

    Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME"bin"java –option 来启动,-option为虚拟 ...

  3. 浅谈linux的命令行解析参数之getopt_long函数

    前言 在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析 ...

  4. C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)

    参考文章:浅谈linux的命令行解析参数之getopt_long函数 文章目录 前言 一.关于命令行参数 二.getopt_long函数 参数以及返回值介绍(以上三个函数都适用): 1.argc和ar ...

  5. .NET:命令行解析器介绍

    背景 经常需要开发一下小工具,之前都是自己解析命令行参数,接触过动态语言社区以后,发现命令行解析有特定的模式和框架可以利用,本文介绍一个 .NET 平台的类库. 示例 需求 拷贝文件,如:CopyFi ...

  6. python getopt argparse_python OptParse模块和argparse命令行解析的用法详解

    https://www.cnblogs.com/wj-1314/p/8974021.html OptParse模块的简单介绍 Python 有两个内建的模块用于处理命令行参数: 一个是 getopt只 ...

  7. Python模块: 命令行解析optionparser

    Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大 ...

  8. python 命令行 解析模块 optparse、argparse

    optparse:https://docs.python.org/zh-cn/3/library/optparse.html argparse :https://docs.python.org/zh- ...

  9. java命令行参数args_Args4J (Java 命令行参数控制开源项目) 使用指南

    Args4J 使用指南 Args4J 是一个用来出来命令行的工具. 在实际的项目中用到命令行的并不是很常见,但当真正使用到时,特别是在程序启动时配置一下参数的时候就很有用了,如果参数很多的话,一个一个 ...

最新文章

  1. [Python]网络打解包
  2. docker存储卷篇
  3. telnet 测试端口连通性
  4. 【手写系列】纯手写实现一个高可用的RPC
  5. php websocket 心跳包,websocket 心跳包重连
  6. java面向对象编程集合边框_Java学习系列(七)Java面向对象之集合框架详解(上)
  7. html 悬浮阴影,css实现悬浮效果的阴影的方法示例
  8. PropertySet 学习一
  9. java 应用程序 gui_Java GUI应用程序关闭陷阱
  10. 转HTML、CSS、font-family:中文字体的英文名称
  11. 密码学专题 证书和CA指令 证书和CA功能概述
  12. java 布局管理器_java布局管理器-borderlayout
  13. python中pass的使用_Python中pass语句的作用
  14. c#中跨线程调用windows窗体控件
  15. 「LOJ#10068」「一本通 3.1 练习 3」秘密的牛奶运输(次小生成树
  16. 数组:求绝对值最小的数
  17. 网络安全系统教程+渗透测试+学习路线(自学笔记)
  18. php--spry框架读取显示xml数据
  19. 30岁后,你拿什么养活自己
  20. 浅浅讲解下Linux内存管理之CMA

热门文章

  1. python中的and_PYTHON中的“and”是什么意思
  2. 直流电机工作原理释义
  3. 二十九 我在软件园的那些日子里
  4. 趋势丨从云到多云,超融合与云管平台如期而遇
  5. Kafka消费者不消费数据
  6. 爆破密码-hydra
  7. 假如你想成为一名测试工程师(程序员找茬师)
  8. matlab中的电子器件,对电力电子器件控制设计进行硬件在环测试
  9. PTA乙级 1100 校庆——25分
  10. 安装工程管道的规格及高程表示方法