在我编写的小程序中,我必须解析一行用户输入。基本上需要做的是将行拆分为一个字符串数组,方法与main()的参数相同,即我正在寻找类似的东西:
String[] splitArgs(String cmdLine);
我只是想知道,如果在调用main本身之前以这种方式解析主要方法的参数,是不是可以调用那个而不是编写自己的?那么,有谁知道在哪里找到这种方法?
谢谢, 阿克塞尔
答案 0 :(得分:5)
命令行参数由shell解析;这就是为什么*
通常会扩展为文件列表的原因。这称为“globbing”,它发生在程序之外,在JVM开始之前。
至于将字符串拆分为字符串数组,最基本的选项是String.split(String regex)
。
这是一个非常简单的例子:
String[] parts = "one two three".split(" ");
for (String part : parts) {
System.out.println("[" + part + "]");
}
以上版画:
[one]
[two]
[three]
String
的{{1}}参数是正则表达式。
split
选项您可以使用的另一个选项是java.util.Scanner
。这是遗产StringTokenizer
的一个更加改进的版本。
Scanner
的示例要获得更强大的Scanner
拆分功能,您可以使用例如来自番石榴的Splitter
。
答案 1 :(得分:4)
不,解析是由shell或系统库(在Windows上)完成的,而不是由Java完成的。您可以使用ProcessBuilder和sh -c(或Windows上的cmd)。类似的东西:
new ProcessBuilder("sh", "-c", "java Program " + cmdLine).start();
答案 2 :(得分:0)
这种解析通常由shell完成。所以你正在寻找的函数将是一个完全独立的程序的一部分,它可能是用C语言编写的。到Java VM开始运行时,参数已经被解析了。
答案 3 :(得分:0)
我刚刚通过apache commons exec找到另一种解决方法。
public static String[] splitArgsStr(String argsStr) {
org.apache.commons.exec.CommandLine execCommandLine = new org.apache.commons.exec.CommandLine("sh");
execCommandLine.addArguments(argsStr, false);
return execCommandLine.getArguments();
}
最新的maven依赖是:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>1.3</version>
</dependency>