停止将命令行参数中的通配符扩展为Java

停止将命令行参数中的通配符扩展为Java,java,shell,cmd,wildcard-expansion,Java,Shell,Cmd,Wildcard Expansion,我的程序必须监视与掩码匹配的文件。文件夹名称和掩码通过命令行参数传递。但是在我可以使用它之前,面具已经被第一个匹配项所取代了 双引号无效,其他符号也无效。我尝试使用\或'来保护输入。但是,这个符号将被添加到args中,这是我不想要的。你知道怎么修吗 public static void main(String[] args) throws IOException { File dir = new File(args[0]); String mask = args[1];

我的程序必须监视与掩码匹配的文件。文件夹名称和掩码通过命令行参数传递。但是在我可以使用它之前,面具已经被第一个匹配项所取代了

双引号无效,其他符号也无效。我尝试使用
\
'
来保护输入。但是,这个符号将被添加到args中,这是我不想要的。你知道怎么修吗

public static void main(String[] args) throws IOException {
    File dir = new File(args[0]);
    String mask = args[1];
    System.out.println(dir.getAbsolutePath());
    System.out.println(mask);
    String regex = args[2];
    System.out.println(regex);
}
args[2]
中的正则表达式也替换为文件夹中的某些文件

Input: "E:\Programming\Java\Task7" *.??? ...
Ouput: E:\Programming\Java\Task7 .git Task7.iml

Input: "E:\Programming\Java\Task7" *.????* [a-zA-Z]
Output: E:\Programming\Java\Task7 .idea [a-zA-Z]

Input: "E:\Programming\Java\Task7" '.???' ...
Output: E:\Programming\Java\Task7 '.???' ...

Input: "E:\Programming\Java\Task7" \\'.???'\\ ...
Output: E:\Programming\Java\Task7 \'.???'\ ...

我知道使用引号或反斜杠不是个坏主意,但我认为有更好的方法。

背景:在Linux上,不是Java在扩展命令参数中的通配符。shell在启动
java
命令之前执行此操作

阻止shell扩展通配符的方法是引用参数。如何做到这一点取决于您使用的shell


现在来看Windows案例。。。这才是你真正想问的

据我所知,标准的“cmd.exe”shell(各种版本/风格)不进行通配符扩展。由应用程序临时进行扩展(或不进行扩展)

显然,对于Java“一次编写,到处运行”的理念来说,这是一个问题,因此Java设计师试图让命令行参数中的通配符在Windows上工作,就像在Unix和Linux上一样。但不幸的是,他们不能完美地完成这项工作。。。因此出现了这种反常现象

然而,据介绍,在参数周围加上双引号告诉Java不要进行通配符扩展

但是如果这没有帮助,你可能就不走运了


以下是有关此主题的Oracle文档的一些链接,摘自Oracle Java bug report:

已经记录了Windows平台上的Java通配符扩展。看见 以下连结:

通配符扩展在Windows命令shell中不适用于 由于Microsoft错误导致的单元素类路径,如中所述:

7u10发行说明中也提到了这些限制:

然而,我认为写这篇文章的Oracle员工故意显得迟钝,因为这些“手册”页面显然没有记录通配符扩展。他们只在
-cp
参数中讨论通配符扩展