当前位置: 首页 > 知识库问答 >
问题:

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

郦楷
2023-03-14

我试图使用apache公共资源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个答案

梁勇
2023-03-14

您的问题实际上与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对*没有特殊的处理。但是,shell有。所以如果你做了:

$ 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,因为此表单会忽略以开头的“隐藏”文件。)

在窗户上

cmd。exe不执行UNIX风格的通配符扩展。如果将*作为参数提供给Windows中的命令,则该命令将获得一个文本*。例如,PKUNZIP*。邮政编码>通行证*。ziptoPKUNZIP。EXE,如果该程序想扩展通配符,则由其自行决定。

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

我无法找到明确的留档的Javafor Windows通配符扩展规则,但您应该能够通过引用来控制它,转义引号以防止cmd.exe解释它们:

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

(未经测试,因为我手边没有一个视窗盒子,引用cmd.exe有点像野兽——请尝试,要么编辑上面的内容,要么留下评论)

 类似资料:
  • 问题内容: 我有一个非常简单的JSON,其中包含产品评论,例如: 我想使用GSON将其读入我的Java应用程序中。我建立了一个类来保存每个评论的结果: 要读取JSON文件,我的代码是: 使用此代码,我只能在JSON中检索第一个评论,所以我的问题是:如何遍历所有读者并获得下一个评论?我不需要将评论存储在列表中,只需要访问对象一次。任何帮助都超过了欢迎。 问题答案: 您必须获取列表中的全部数据,然后再

  • 问题内容: 假设我有一个包含以下内容的文件: 如何通过PHP解析内容? 问题答案: 只需使用该功能即可解析CSV文件

  • 问题内容: 我试图使用PHP解析JSON文件。但是我现在被困住了。 这是我的JSON文件的内容: 到目前为止,这是我尝试过的: 但是,因为我不知道的名字(例如,)和所有可用键和值(如,)事前,我想我需要创建一些foreach循环。 我希望为此举一个例子。 问题答案: 要遍历多维数组,可以使用RecursiveArrayIterator 输出:

  • 问题内容: 我使用以下代码来解析html模板。它运作良好。 和html模板test.html。 但是当我将html文件移动到另一个目录时。然后使用以下代码。输出始终为空。 谁能告诉我怎么了?还是无法使用html / template包? 问题答案: 出问题的是您的程序(程序包)找不到文件。当您指定相对路径(您是相对路径)时,它们将解析到当前工作目录。 您必须确保html文件/模板在正确的位置。例如

  • 我有一个非常简单的产品评论JSON,比如: 我想用GSON把它读到我的Java应用程序中。我构建了一个类来保存每次复习的结果: 使用这段代码,我只能检索JSON中的第一个评论,所以我的问题是:如何遍历所有阅读器并获得下一个评论?我不需要将评论存储在列表中,只需要访问对象一次。任何帮助都大于欢迎。