Java程序的入口是main方法,命令行参数就是通过main方法的形参传递到程序内部的,理解main方法参数的结构是使用命令行参数的基础。

main方法参数的基本结构
Java的main方法标准定义如下,其中String[] args就是用来接收命令行参数的数组:
public static void main(String[] args) {
// 程序逻辑
}
这里的args是一个字符串数组,数组中的每个元素对应一个传入的命令行参数,参数的顺序和命令行中传入的顺序完全一致。
如何从命令行传入参数
假设我们有一个编译后的Java类文件Test.class,在命令行中运行该程序时,直接在类名后面跟上参数即可,多个参数之间用空格分隔:
java Test 参数1 参数2 参数3
如果参数本身包含空格,需要用英文双引号把整个参数包裹起来,避免被解析成多个参数:
java Test "这是一个带空格的参数" 参数2
解析main参数的常用方式
直接遍历参数数组
如果参数数量少且没有固定格式,可以直接遍历args数组获取每个参数:
public class Test {
public static void main(String[] args) {
// 判断是否有传入参数
if (args.length == 0) {
System.out.println("未传入任何命令行参数");
return;
}
// 遍历参数数组
for (int i = 0; i < args.length; i++) {
System.out.println("第" + (i + 1) + "个参数是:" + args[i]);
}
}
}
解析键值对格式参数
实际开发中更常用的是键值对格式的参数,比如--name=张三 --age=20,这种格式的参数解析逻辑如下:
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, String> paramMap = new HashMap<>();
for (String arg : args) {
// 判断参数是否符合键值对格式
if (arg.startsWith("--") && arg.contains("=")) {
String[] split = arg.substring(2).split("=", 2);
if (split.length == 2) {
paramMap.put(split[0], split[1]);
}
}
}
// 获取解析后的参数
String name = paramMap.get("name");
String age = paramMap.get("age");
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
}
}
在命令行中运行上述程序时传入参数:
java Test --name=张三 --age=20
程序会输出解析后的姓名和年龄信息。
使用第三方工具解析复杂参数
如果参数格式复杂,需要支持短参数、参数校验等功能,可以使用Apache Commons CLI等第三方工具,这里以Commons CLI为例展示基础用法:
import org.apache.commons.cli.*;
public class Test {
public static void main(String[] args) {
// 创建选项对象
Options options = new Options();
options.addOption("n", "name", true, "用户姓名");
options.addOption("a", "age", true, "用户年龄");
// 创建解析器
CommandLineParser parser = new DefaultParser();
try {
CommandLine cmd = parser.parse(options, args);
// 获取参数
String name = cmd.getOptionValue("name");
String age = cmd.getOptionValue("age");
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
} catch (ParseException e) {
System.out.println("参数解析失败:" + e.getMessage());
}
}
}
命令行传入参数时可以使用短格式或者长格式:
java Test -n 张三 -a 20 # 或者 java Test --name=张三 --age=20
注意事项
- 命令行参数的索引从0开始,和数组的索引规则一致
- 传入的参数都会被当成字符串处理,如果需要其他类型需要手动转换,比如把年龄参数转成整数需要做类型转换
- 如果参数中包含特殊字符,需要根据命令行规则做转义处理,避免解析错误
- 程序运行前需要先编译Java文件,保证class文件是最新版本,避免参数解析逻辑不生效