我的程序必须监视与掩码匹配的文件。文件夹名称和掩码通过命令行参数传递。但是在我使用之前,面具会被第一场比赛取代!
双引号也没有效果,也有其他符号。我尝试使用\
或'
来保护输入。然而,这个符号将被添加到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 \'.???'\ ...
我知道使用引号或反斜杠并不是一个坏主意,但我认为存在更好的方法。
答案 0 :(得分:8)
背景:在Linux上,Java不是在命令参数中扩展通配符。 shell在启动java
命令之前执行。
阻止shell扩展通配符的方法是引用参数。如何执行此操作取决于您使用的shell。
现在针对Windows案例......这就是你真正要问的问题。
根据我的阅读,标准的“cmd.exe”shell(各种版本/版本)不进行通配符扩展。应用程序可以在临时的基础上进行扩展(或不进行扩展)。
显然这对于Java“一次编写,随处运行”的理念是有问题的,因此Java设计人员试图在命令行参数中使用通配符在Windows上工作,就像在Unix和Linux上一样。但不幸的是,他们无法做到这一点完美的工作......因此这种异常现象。
但是,根据this page,在参数周围加上双引号会告诉Java不要进行外卡扩展。
但如果这没有帮助,你可能会运气不好。
以下是有关此主题的Oracle文档的一些链接,这些链接取自Oracle Java错误报告#5036373:
已记录Windows平台上的Java Wildcard扩展。看到 以下链接:
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
通配符扩展在Windows的命令shell中不起作用 单个元素类路径,因为在以下描述的Microsoft错误: http://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling-broken
7u10发行说明中也提到了这些限制: http://www.oracle.com/technetwork/java/javase/7u10-relnotes-1880995.html
但是,我认为撰写该文章的Oracle员工故意使用故障,因为通常的通配符扩展通常不会记录在那些“手动”页面中。他们只讨论-cp
参数中的通配符扩展。