Java Path中的星号

时间:2014-12-17 09:46:15

标签: java path glob

我正在浏览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 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专业考试,所以我不确定。

2 个答案:

答案 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

  • Java禁止在&lt;之前使用char。 32(ASCII)
  • Java禁止在此列表中使用char:&lt;&gt;:\“|?*
  • Java禁止路径组件以空格结尾。

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

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

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

  

整数表示的范围为1的字符   到31,除了这些字符的备用数据流   被允许。有关文件流的更多信息,请参阅文件流

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