有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试使用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)上体验到了这一点。我很确定这是**这导致了问题,当我换成使用不使用*的模式时,预期的模式就会出现


共 (1) 个答案

  1. # 1 楼答案

    您的问题实际上与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。我解释它们:

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

    (未经测试,因为我手头没有Windows box,在cmd.exe中引用有点像野兽——请尝试并编辑以上内容或留下评论)