gpt4 book ai didi

java - 如何使用 Apache commons CLI 解析文件模式

转载 作者:行者123 更新时间:2023-11-30 10:25:40 27 4
gpt4 key购买 nike

我正在尝试使用 apache commons CLI 解析我的命令行参数。对于此处的示例,它可能有点笨拙,但在我正在创建的程序的上下文中它是有意义的。我正在尝试读取文件模式过滤器,类似于 grep 用来选择要处理的文件的方式。

我的论点是这样的:

Program --input *.*

我已经编写了一个测试程序来查看解析器看到了什么;

public static void main(String[] args) {

Options options = new Options();
options.addOption(new Option(INPUT_FILTER_SHORT, INPUT_FILTER_LONG, true, INPUT_FILTER_DESCRIPTION));

CommandLineParser parser = new BasicParser();
CommandLine cmd = parser.parse(options, args);

System.out.println(cmd.getOptionValue(INPUT_FILTER_SHORT));
}

打印出来:

.classpath

如果我将我的参数更改为:

Program --input test.txt

我得到输出:

test.txt

我假设我必须做一些事情来告诉 apache commons 什么 * 不是特殊字符?我似乎无法在网上找到任何关于此的信息。

我在 Windows (7) 上遇到过这种情况。我相当确定是 *.* 导致了问题,因为当我切换到使用不使用 * 的模式时,预期的模式出现了。

最佳答案

您的问题实际上与 Commons CLI 无关,而是与 shell 和 Java 可执行文件如何一起处理参数有关。

要排除其他因素并查看发生了什么,请使用一个简短的 Java 程序:

public class ArgsDemo {
public static void main(String[] args) {
for(int i=0; i<args.length; i++) {
System.out.println("" + i + ": " + args[i]);
}
}
}

java ArgsDemo hello worldjava ArgsDemo * 等,观察会发生什么。

在 UNIX 和 Linux 上:

Java 没有对* 做特殊处理。但是,外壳可以。所以如果你这样做了:

$ mkdir x
$ cd x
$ touch a b
$ java -jar myjar.jar MyClass *

...然后 MyClass.main() 将使用参数数组 ["a","b"] 调用——因为 UNIX shell 扩展 * 到当前目录中的文件。

你可以通过转义来抑制它:

$ java -jar myjar MyClass *  // main() sees ["*"])

(请注意,UNIX shell 不会将 *.* 扩展为 .classpath,因为这种形式会忽略以 开头的“隐藏”文件.)

在 Windows 上

cmd.exe 不进行 UNIX 风格的通配符扩展。如果您将 * 作为参数提供给 Windows 中的命令,该命令将获得文字 *。因此,例如,PKUNZIP *.zip*.zip 传递给 PKUNZIP.EXE,如果它扩展通配符则由该程序决定想要。

自从某些版本的 Java 7 以来,Windows 的 Java 可执行文件在将参数传递给您的 main() 类之前,对自己的文件名进行了一些通配符扩展。

我无法找到 Java-for-Windows 通配符扩展规则的清晰文档,但您应该能够通过引用控制它,转义引号以防止 cmd.exe 解释它们:

> java.exe -jar myjar.jar MyClass """*.*"""

(未经测试,因为我没有方便的 Windows 盒子,并且在 cmd.exe 中引用有点野兽 - 请尝试并编辑以上内容或发表评论)

关于java - 如何使用 Apache commons CLI 解析文件模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46059381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com