java nio 处理目录和目录树

例子很简单,不过这里也有一个坑,就是path对应的系统文件也可能是不存在的,而且它的很多方法返回的都是Path类型

代码

        Path workspace = Paths.get(“C:/DEV/workspace_study”);
        Path p = workspace.resolve(“Sample/src/com/nio/TestPath.java”);
        System.out.println(p);

会给出

        C:\DEV\workspace_study\Sample\src\com\nio\TestPath.java


写成Path p = workspace.resolve(“Sample/src/com/nio/TestPath.java2”);

同样会给出C:\DEV\workspace_study\Sample\src\com\nio\TestPath.java2,不过注意这个java2文件不是真实存在的

另外 p.getFileName() 则会返回一个Path对象,而不是String

更进一步,如果你在调用toAbsolutePath()方法之前先调用了getFileName得到一个Path对象,那么恭喜你,你再调用toAbsolutePath()得到的对象可能是不存在的文件

System.out.println(p.toAbsolutePath());
System.out.println(p.getFileName().toAbsolutePath());

C:\DEV\workspace_study\Sample\src\com\nio\TestPath.java (存在)
C:\DEV\workspace_study\Sample\TestPath.java (不存在)

package com.nio;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class TestPath {

    public static void main(String[] args) throws IOException {
        Path workspace = Paths.get("C:/DEV/workspace_study");
        Path fullpath = workspace.resolve("Sample/src/com/nio/TestPath.java");
        
        System.out.println(fullpath);
        
        DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("C:/DEV/workspace_study/1/src"),"*.java");
        for(Path p:stream){
            System.out.println(p.getFileName());
        }
        
        Files.walkFileTree(workspace, new FindJavaVisitor());
        
    }

}

class FindJavaVisitor extends SimpleFileVisitor<Path> {
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        if(file.getFileName().toString().endsWith(".java")){
            System.out.println(file);
        }
        return FileVisitResult.CONTINUE;
    }
}
C:\DEV\workspace_study\Sample\src\com\nio\TestPath.java
Com.java
Ref.java
C:\DEV\workspace_study\1\src\Com.java
C:\DEV\workspace_study\1\src\Ref.java
C:\DEV\workspace_study\Sample\src\com\nio\TestPath.java
C:\DEV\workspace_study\Sample\src\com\stream\Stu.java
C:\DEV\workspace_study\Sample\src\com\stream\Student.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream2.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream3.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream4.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream5.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream6.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream7.java
C:\DEV\workspace_study\Sample\src\com\stream\TestStream8.java