Java Path中的星号

我正在阅读OCA / OCP Java SE和程序员I和II学习指南。 在页52​​0上有一个用于匹配的方法:

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:

 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 

我的问题是:我在设置中遗漏了什么吗? 我是否需要启用特定function才能运行此function? 或者这本书错了吗? 我只是在学习Java专业考试,所以我不确定。

在Windows操作系统上,不允许使用字符*作为有效的文件和目录名称。 Microsoft Developer Network上列出的字符也是如此:

您可以使用当前代码页中的任何字符作为名称,包括扩展字符集(128-255)中的Unicode字符和字符,但以下保留字符除外:

  • <(小于)
  • >(大于)
  • :(冒号)
  • “(双引号)
  • /(正斜杠)
  • \(反斜杠)
  • | (竖杆或管道)
  • ? (问号)
  • *(星号)
  • 整数值为零,有时也称为ASCII NUL字符。
  • 整数表示forms在1到31范围内的字符,但允许使用这些字符的备用数据流除外。 有关文件流的更多信息,请参阅文件流。
  • 目标文件系统不允许的任何其他字符。

对于UNIX,请参阅Wikipedia 。 在POSIX允许的字符包括A–Z a–z 0–9 . _ - A–Z a–z 0–9 . _ - ,保留为/ null

可能是在允许*的操作系统上运行的示例。

如果你想知道你的代码失败了哪个字符(除了上一个答案中解释的那个),你可以在OpenJDK源代码中读取方法规范化: WindowsPathParser

  • Java禁止在<32(ASCII)之前使用char
  • Java禁止在此列表中使用char:<>:\“|?*
  • Java禁止Path组件以空格结束。

最后一个是一个棘手的问题:当你使用资源管理器时,它会在文件输入结束时修剪空间,但是一些C / C ++ Windows API(甚至是C fopen )允许在它们的末尾创建带空格的路径。

结果是您无法从资源管理器重命名/删除文件/目录(因为它修剪了文件名)。

此外,因为之前的答案引用了MSDN:

整数表示forms在1到31范围内的字符,但允许使用这些字符的备用数据流除外。 有关文件流的更多信息,请参阅文件流

normalize方法(由Paths.get中显示的Paths.get调用)不允许使用’:’来指定流(请参阅使用Streams )。