为什么 'Path.startsWith' 行为不同于 'String.startsWith' 操作 - 即使对于 'Path.getFilename'

Why is 'Path.startsWith' behaviour different from a 'String.startsWith' operation - even for 'Path.getFilename'

我正在使用 Java 版本 1.8。0_31。

我正在尝试使用 FileVisitor 接口递归访问目录树。 程序应打印 C:/books 中文件名以 "Ver" 开头的所有文件的名称。 目录 C:/books 有两个以 "Ver"、Version.yxyVersion1.txt 开头的文件。 我尝试使用 file.getFileName().startsWith("Ver") 但这个 returns false.

我错过了什么吗?这是我的代码:

public class FileVisitorTest {

    public static void main(String[] args) {

        RetriveVersionFiles vFiles = new RetriveVersionFiles();
        try {
            Files.walkFileTree(Paths.get("c:", "books"), vFiles);
        } catch (IOException e) {
            // TODO Auto-generated catch block
         e.printStackTrace();
        }
    }
}

class RetriveVersionFiles extends SimpleFileVisitor<Path> {

    public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
        System.out.println(file.getFileName().startsWith("Ver") + " "
              + file.getFileName());
        if (file.getFileName().startsWith("Ver")) {
            //not entering this if block
            System.out.println(file);
        }
        return FileVisitResult.CONTINUE;
   }
}

以上代码的输出为:

false Version.txt
false Version1.txt

Path.getFileName() returns a Path containing just the file name. Path.startsWith 检查路径是否以相同的路径组件序列开始——逻辑操作,而不是文本操作。 startsWith Javadoc 是明确的:

On UNIX for example, the path "foo/bar" starts with "foo" and "foo/bar". It does not start with "f" or "fo".

如果您只想检查文本的开头方式,请先通过调用 toString() 转换为字符串:Path.getFileName().toString().startsWith("Ver").