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

时间:2015-05-10 21:57:31

标签: java java.nio.file

我使用的是Java版本1.8.0_31。

我正在尝试使用FileVisitor接口递归访问目录树。 程序应打印C:/books中文件名以" Ver"开头的所有文件的名称。 目录C:/books有两个以" Ver",Version.yxyVersion1.txt开头的文件。 我尝试使用file.getFileName().startsWith("Ver"),但这会返回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

1 个答案:

答案 0 :(得分:6)

Path.getFileName()返回仅包含文件名的PathPath.startsWith检查路径是否以相同的路径组件序列开始 - 逻辑操作,而不是文本操作。 startsWith Javadoc是明确的:

  

在UNIX上,例如,路径“foo / bar”以“foo”和“foo / bar”开头。它不以“f”或“fo”开头。

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