Skip to content

Files 工具类

JDK 7 的 Files 工具类是文件操作的瑞士军刀

无论是读文件、写文件、复制、移动、遍历,一个类全搞定。

读取文件

一行代码读取整个文件(JDK 11+):

java
// 最简写法
String content = Files.readString(Path.of("file.txt"));
List<String> lines = Files.readAllLines(Path.of("file.txt"));
byte[] data = Files.readAllBytes(Path.of("file.bin"));

流式处理大文件(省内存):

java
// 按行处理
try (Stream<String> stream = Files.lines(Path.of("file.txt"))) {
    stream.filter(l -> l.length() > 10)
          .forEach(System.out::println);
}

写入文件

java
// JDK 11+ 最简写法
Files.writeString(Path.of("out.txt"), "content");

// JDK 7+ 写法
Files.write(Path.of("out.txt"), "content".getBytes());
Files.write(Path.of("out.txt"), List.of("line1", "line2"));

// 追加模式
Files.writeString(Path.of("out.txt"), "append", StandardOpenOption.APPEND);

创建与删除

java
// 创建文件
Files.createFile(Path.of("new.txt"));

// 创建目录
Files.createDirectory(Path.of("newdir"));

// 创建多层目录(父目录不存在也会创建)
Files.createDirectories(Path.of("a/b/c/dir"));

// 删除
Files.delete(Path.of("file.txt"));
Files.deleteIfExists(Path.of("file.txt")); // 不存在也不报错

复制与移动

java
// 复制
Files.copy(Path.of("src.txt"), Path.of("dst.txt"));

// 移动(剪切)
Files.move(Path.of("src.txt"), Path.of("dst.txt"));

// 如果目标存在要替换
Files.copy(Path.of("src.txt"), Path.of("dst.txt"),
    StandardCopyOption.REPLACE_EXISTING);
Files.move(Path.of("src.txt"), Path.of("dst.txt"),
    StandardCopyOption.REPLACE_EXISTING);

遍历目录

java
// list:只遍历一层
try (Stream<Path> stream = Files.list(Path.of("dir"))) {
    stream.filter(p -> p.toString().endsWith(".txt"))
          .forEach(System.out::println);
}

// walk:遍历所有子目录
try (Stream<Path> stream = Files.walk(Path.of("dir"))) {
    stream.forEach(System.out::println);
}

// find:带条件过滤(最多遍历 N 层)
try (Stream<Path> stream = Files.find(Path.of("dir"),
    10,  // 最大深度
    (p, a) -> p.toString().endsWith(".txt"))) {  // 过滤条件
    stream.forEach(System.out::println);
}

获取文件属性

java
Path path = Path.of("file.txt");

Files.size(path);              // 文件大小(字节)
Files.getLastModifiedTime(path); // 最后修改时间

// 判断类型
Files.isRegularFile(path);     // 普通文件
Files.isDirectory(path);       // 目录
Files.isSymbolicLink(path);    // 符号链接

// 读属性
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
attrs.creationTime();    // 创建时间
attrs.lastModifiedTime(); // 修改时间
attrs.size();            // 大小
attrs.isDirectory();     // 是否目录

临时文件/目录

java
// 创建临时文件
Path tempFile = Files.createTempFile("prefix", ".tmp");

// 创建临时目录
Path tempDir = Files.createTempDirectory("mydir");

// 带自定义路径
Path temp = Files.createTempFile(Path.of("/tmp"), "prefix", ".tmp");

行数统计示例

综合运用:

java
// 统计文件行数(带过滤)
public static long countLines(Path path, Predicate<String> filter) throws IOException {
    try (Stream<String> lines = Files.lines(path)) {
        return lines.filter(filter).count();
    }
}

// 用法
long javaLines = countLines(Path.of("Main.java"), l -> !l.trim().isEmpty());
long commentLines = countLines(Path.of("Main.java"), l -> l.trim().startsWith("//"));

记住几个常用组合:

读全文 readString,写内容 writeString,遍历目录 walk,创建目录 createDirectories(带 s)。

下一节,我们来看一个高级功能——WatchService,监听文件变化。

基于 VitePress 构建