Files.walk()操作系统独立性问题

时间:2016-03-20 18:17:54

标签: java nio2

我有以下代码在Linux / Unix下正常工作:

Files.walk(Paths.get(getStartingPath()))
     .filter(Files::isDirectory)
     // Skip directories which start with a dot (like, for example: .index)
     .filter(path -> !path.toAbsolutePath().toString().matches(".*/\\..*"))
     // Note: Sorting can be expensive:
     .sorted()
     .forEach(operation::execute);

但是,在Windows下,这部分似乎无法正常工作:

     .filter(path -> !path.toAbsolutePath().toString().matches(".*/\\..*"))

使这种独立于操作系统的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您不应将Path与硬编码文件分隔符进行匹配。这肯定会引起问题。

这里你想要的是一种获取目录名称的方法,如果它以点开头则跳过它。您可以使用getFileName()检索目录的名称:

  

将此路径表示的文件或目录的名称作为Path对象返回。文件名是目录层次结构中根目录的 farthest 元素。

然后您可以使用startsWith(".")查看它是否以点开头。

因此,你可以

.filter(path -> !path.getFileName().startsWith("."))

答案 1 :(得分:2)

@Tunaki建议的另一个解决方案是尝试用特定于操作系统的文件分隔符替换正斜杠(如果它是Windows上的反斜杠字符,则需要转义它):

.filter(path -> 
        !path.toAbsolutePath().toString().matches(".*"
                                        + Pattern.quote(File.separator) + "\\..*"))