Java NIO Files
Path 与 Files 的用法、文件读写、目录遍历与 NIO 相对传统 IO 的优势。
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.
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));
}
}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.
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);
}
}[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.
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);
}
}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.
| Aspect | java.io.File | java.nio.file |
|---|---|---|
| Path model | File only | Path / Paths |
| Error reporting | boolean return | Exceptions |
| Read all text | Manual streams | Files.readString |
| Directory walk | Recursive code | Files.walk |
Path 与 Files
Path.of("a/b.txt") 创建路径对象,Files.exists / isDirectory / size 查询信息。Path 只是路径,不打开文件;真正操作靠 Files 的静态方法。
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));
}
}true
9
nio_demo.txt
hello nio读写文件
Files.readString / writeString 一行搞定小文件;readAllLines 按行读成 List<String>。大文件用 Files.lines 得到 Stream,惰性读取、不占内存。
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);
}
}[l1, l2, l3]
3
3目录操作
Files.createDirectories 递归建目录(父目录不存在也不报错),Files.list 列一层,Files.walk 递归遍历,Files.copy / move / delete 做文件操作。
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);
}
}true
[a.txt]
2与传统 I/O 的对比
传统 File 的 delete() 失败只返回 false,不告诉你原因;NIO 的 Files.delete 抛具体异常。NIO 还提供通道、内存映射、文件锁等能力。
| 对比项 | java.io.File | java.nio.file |
|---|---|---|
| 路径模型 | 仅 File | Path / Paths |
| 错误反馈 | 返回布尔值 | 抛异常 |
| 读全部文本 | 手动流 | Files.readString |
| 目录遍历 | 手写递归 | Files.walk |