在不使用第三方库的情况下使用标志解析命令行 args[]
Parsing command line args[], with flags and without using a third party lib
我需要在不使用任何第三方库(如 Apache CLI or JCommander)的情况下解析 Java 应用程序中的一些命令行参数。我只能用标准的Java 11 API.
它们将在启动时通过标志传递到我的应用程序中;例如:java myClass -port 14008 -ip 140.086.12.12
可以是任何顺序。
我是 Java 的新手,但我该怎么做呢?任何标准 API 函数都可以帮助解决这个问题吗?或者我应该手动检查它们,例如:if arg[0] = "-port" then arg[0]+1 = port number.
命令行将用白色分隔 spaces 您将在“Java MyClass”之后编写的所有内容。因此,每个用 space 分隔的“单词”都将被视为一个参数。
您可能想将它们打包在一起,然后使用分隔符将它们拆分,就像这样 Java myClass -port:14008 -ip:140.086.12.12
。
或者,如果您想保留参数样式,您可能需要在括号内添加索引位移,如下所示
int port = 0;
String ip = "";
for (int i=0; i<args.length; i+=2){
if (args[i].equals("port")){
port = Integer.parseInt(args[i+1]);
} else if (args[i].equals("ip")){
ip = args[i+1];
}
}
顺便说一句,这是一篇非常好的文章,它很快解释了 Java 如何接受命令行参数。您可能会发现它很有用。
https://www.baeldung.com/java-command-line-arguments
编辑:感谢@Andy Turner 的评论
我就是这样解决问题的。它假设有 class 个成员变量设置了默认值以覆盖。
private String ipAddress = "localhost";
private Integer port = 14001;
/**
* Method to get the ip and port number from the command line args.
* It caters for any order of flag entry.It tries to override the
* defaults set as a class variables, so if it can't, it uses those.
*
* @param args The args passed in by the user.
*/
private void getPortAndIp(String[] args) {
System.out.println("Getting inputs ");
if ((args[0].equals("-ccp")) && (args.length == 2)) {
this.port = Integer.parseInt(args[1]);
} else if ((args[0].equals("-cca")) && (args.length == 2)) {
this.ipAddress = args[1];
} else if ((args[0].equals("-ccp")) && (args[2].equals("-cca"))
&& (args.length == 4)) {
this.port = Integer.parseInt(args[1]);
this.ipAddress = args[3];
} else if ((args[0].equals("-cca")) && (args[2].equals("-ccp"))
&& (args.length == 4)) {
this.port = Integer.parseInt(args[3]);
this.ipAddress = args[1];
} else {
System.out.println("Options:");
System.out.println("-ccp [port number]");
System.out.println("-cca [ip address]");
System.out.println("Could not determine port from command line " +
"arguments, using defaults: ");
}
System.out.println("on " + this.ipAddress + ":" + this.port);
}
我需要在不使用任何第三方库(如 Apache CLI or JCommander)的情况下解析 Java 应用程序中的一些命令行参数。我只能用标准的Java 11 API.
它们将在启动时通过标志传递到我的应用程序中;例如:java myClass -port 14008 -ip 140.086.12.12
可以是任何顺序。
我是 Java 的新手,但我该怎么做呢?任何标准 API 函数都可以帮助解决这个问题吗?或者我应该手动检查它们,例如:if arg[0] = "-port" then arg[0]+1 = port number.
命令行将用白色分隔 spaces 您将在“Java MyClass”之后编写的所有内容。因此,每个用 space 分隔的“单词”都将被视为一个参数。
您可能想将它们打包在一起,然后使用分隔符将它们拆分,就像这样 Java myClass -port:14008 -ip:140.086.12.12
。
或者,如果您想保留参数样式,您可能需要在括号内添加索引位移,如下所示
int port = 0;
String ip = "";
for (int i=0; i<args.length; i+=2){
if (args[i].equals("port")){
port = Integer.parseInt(args[i+1]);
} else if (args[i].equals("ip")){
ip = args[i+1];
}
}
顺便说一句,这是一篇非常好的文章,它很快解释了 Java 如何接受命令行参数。您可能会发现它很有用。
https://www.baeldung.com/java-command-line-arguments
编辑:感谢@Andy Turner 的评论
我就是这样解决问题的。它假设有 class 个成员变量设置了默认值以覆盖。
private String ipAddress = "localhost";
private Integer port = 14001;
/**
* Method to get the ip and port number from the command line args.
* It caters for any order of flag entry.It tries to override the
* defaults set as a class variables, so if it can't, it uses those.
*
* @param args The args passed in by the user.
*/
private void getPortAndIp(String[] args) {
System.out.println("Getting inputs ");
if ((args[0].equals("-ccp")) && (args.length == 2)) {
this.port = Integer.parseInt(args[1]);
} else if ((args[0].equals("-cca")) && (args.length == 2)) {
this.ipAddress = args[1];
} else if ((args[0].equals("-ccp")) && (args[2].equals("-cca"))
&& (args.length == 4)) {
this.port = Integer.parseInt(args[1]);
this.ipAddress = args[3];
} else if ((args[0].equals("-cca")) && (args[2].equals("-ccp"))
&& (args.length == 4)) {
this.port = Integer.parseInt(args[3]);
this.ipAddress = args[1];
} else {
System.out.println("Options:");
System.out.println("-ccp [port number]");
System.out.println("-cca [ip address]");
System.out.println("Could not determine port from command line " +
"arguments, using defaults: ");
}
System.out.println("on " + this.ipAddress + ":" + this.port);
}