我正在浏览OCA / OCP Java SE&程序员I& II学习指南。在页520上有一个用于匹配的方法:
public void matches(Path path, String glob){
PathMatcher matcher = FileSystems.getDefault().getPathMatcher(glob);
System.out.println(matcher.matches(path));
}
现在,在下一页上有一段代码可以使用这种方法:
public static void main(String [] args){
Path path1= Paths.get("0*b/test/1");
Path path2 = Paths.get("9\\*b/test/1");
Path path3 = Paths.get("01b/test/1");
Path path4 = Paths.get("0*b/1");
String glob = "glob:[0-9]\\*{A*,b}/**/1";
matches(path1,glob);
matches(path2,glob);
matches(path3,glob);
matches(path4,glob);
}
根据这本书,结果应该是: 真正 假 假 假
但是,当我尝试运行它时,我得到以下异常:
Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <*> at index 1: 0*b/test/1
at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94)
at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255)
at java.nio.file.Paths.get(Paths.java:84)
at pathmatcherobjective.PathMatcherObjective.main(PathMatcherObjective.java:63)
Java Result: 1
我的问题是:我在设置中遗漏了什么吗?我是否需要启用特定功能才能运行此功能?或者这本书错了吗?我只是在学习Java专业考试,所以我不确定。
答案 0 :(得分:2)
在Windows操作系统上,不允许使用字符*
来获取有效的文件和目录名称。 Microsoft Developer Network上列出的字符也是如此:
您可以使用当前代码页中的任何字符作为名称, 包括扩展字符中的Unicode字符和字符 设置(128-255),以下保留字符除外:
- &LT; (小于)
- &GT; (大于)
- :(冒号)
- “(双引号)
- /(正斜线)
- \(反斜杠)
- | (竖杆或竖管)
- ? (问号)
- *(星号)
- 整数值为零,有时也称为ASCII NUL字符。
- 整数表示形式在1到31范围内的字符,但这些字符的备用数据流除外 被允许。有关文件流的更多信息,请参阅文件 流。
- 目标文件系统不允许的任何其他字符。
对于UNIX,请参阅Wikipedia。
在POSIX允许的字符包括A–Z a–z 0–9 . _ -
,保留为/ null
。
可能是在允许*
的操作系统上运行的示例。
答案 1 :(得分:1)
如果您想知道哪个字符的代码失败(除了上一个答案中解释的那个),您可以在OpenJDK源代码中阅读方法规范化:WindowsPathParser
最后一个是一个棘手的问题:当你使用资源管理器时,它会在文件输入结束时修剪空间,但是一些C / C ++ Windows API(甚至是C fopen
)允许创建带有空格的路径他们的结局。
结果是一个文件/目录,您无法从资源管理器中重命名/删除(因为它会修剪文件名)。
此外,因为之前的答案引用了MSDN:
整数表示的范围为1的字符 到31,除了这些字符的备用数据流 被允许。有关文件流的更多信息,请参阅文件流
normalize方法(由堆栈跟踪中显示的Paths.get
调用)不允许使用':'来指定流(请参阅Using Streams)。