【问题标题】:Asterisks in Java PathJava 路径中的星号
【发布时间】:2015-02-15 19:46:11
【问题描述】:

我正在阅读 OCA/OCP Java SE & Programmer I & II Study Guide。在第 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 专业考试而学习,所以我不确定一切。

【问题讨论】:

    标签: java path glob


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢你,这肯定解释了。我完全迷失在这里了。
    【解决方案2】:

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

    • Java 禁止在
    • Java 禁止在此列表中使用 char::\"|?*
    • Java 禁止 Path 组件以空格结尾。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 2020-04-14
      • 2017-03-21
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多