Java NIO Files

Path 与 Files 的用法、文件读写、目录遍历与 NIO 相对传统 IO 的优势。

Intermediate
Key PointsJava 7 起用 java.nio.file:Path 表示路径、Files 提供静态工具方法,比 File 更全、异常更明确。

Path 与 Files

Path.of("a/b.txt") builds a path object and Files.exists / isDirectory / size query it. A Path is only a path — the real work happens in Files static methods.

Java
import java.nio.file.Files;
import java.nio.file.Path;

public class PathDemo {
    public static void main(String[] args) throws Exception {
        Path p = Path.of("nio_demo.txt");
        Files.writeString(p, "hello nio");

        System.out.println(Files.exists(p));
        System.out.println(Files.size(p));
        System.out.println(p.getFileName());
        System.out.println(Files.readString(p));
    }
}
Output
true
9
nio_demo.txt
hello nio

读写文件

Files.readString / writeString handle small files in one line; readAllLines yields a List<String>. For big files use Files.lines, a lazy Stream that does not load everything.

Java
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class ReadWrite {
    public static void main(String[] args) throws Exception {
        Path p = Path.of("lines.txt");
        Files.write(p, List.of("l1", "l2", "l3"));

        List<String> lines = Files.readAllLines(p);
        System.out.println(lines);
        System.out.println(lines.size());

        long count = Files.lines(p).count();
        System.out.println(count);
    }
}
Output
[l1, l2, l3]
3
3

目录操作

Files.createDirectories creates parents as needed, Files.list shows one level, Files.walk recurses, and Files.copy / move / delete handle files.

Java
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;

public class DirOps {
    public static void main(String[] args) throws Exception {
        Path dir = Path.of("nio_dir", "sub");
        Files.createDirectories(dir);
        Files.writeString(dir.resolve("a.txt"), "x");

        System.out.println(Files.isDirectory(dir));

        List<String> names = Files.list(dir)
                .map(p -> p.getFileName().toString())
                .sorted()
                .collect(Collectors.toList());
        System.out.println(names);

        long dirs = Files.walk(Path.of("nio_dir")).filter(Files::isDirectory).count();
        System.out.println(dirs);
    }
}
Output
true
[a.txt]
2

与传统 I/O 的对比

Legacy File.delete() returns false without a reason; Files.delete throws a specific exception. NIO also adds channels, memory mapping and file locks.

Aspectjava.io.Filejava.nio.file
Path modelFile onlyPath / Paths
Error reportingboolean returnExceptions
Read all textManual streamsFiles.readString
Directory walkRecursive codeFiles.walk

Friends & Partners