Java在NIO包中提供了Paths和Files两个核心类,用于简化文件与路径的操作,替代了传统IO中File类部分繁琐的操作逻辑,支持更丰富的文件处理功能,适配现代Java开发的需求。

Paths类核心用法
Paths类主要用于获取Path对象,Path对象代表文件系统中的路径,可以是绝对路径也可以是相对路径,相比传统字符串路径,它提供了更规范的路径操作方法。
获取Path对象
通过Paths.get()方法可以快速获取Path实例,该方法支持传入单个路径字符串或者多个路径片段拼接。
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathsDemo {
public static void main(String[] args) {
// 获取绝对路径
Path absolutePath = Paths.get("D:/test/demo.txt");
// 获取相对路径,相对于当前项目根目录
Path relativePath = Paths.get("src", "main", "resources", "config.properties");
System.out.println("绝对路径:" + absolutePath);
System.out.println("相对路径:" + relativePath);
}
}
Path对象常用方法
Path对象提供了多个实用的路径处理方法,不需要手动拼接字符串就可以完成路径解析:
- getFileName():获取路径最后的文件名或目录名
- getParent():获取父路径
- toAbsolutePath():转换为绝对路径
- resolve(Path other):拼接路径,相当于在当前路径后追加子路径
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathMethodDemo {
public static void main(String[] args) {
Path path = Paths.get("D:/test/a/b.txt");
System.out.println("文件名:" + path.getFileName());
System.out.println("父路径:" + path.getParent());
System.out.println("绝对路径:" + path.toAbsolutePath());
// 拼接子路径
Path newPath = path.resolve("sub/c.txt");
System.out.println("拼接后路径:" + newPath);
}
}
Files类核心用法
Files类包含了大量静态方法,用于完成文件的创建、读写、复制、删除、遍历等所有常见操作,所有方法都接收Path对象作为参数,和Paths类配合使用非常便捷。
文件基础操作
Files类提供了简单的API完成文件的存在性判断、创建、删除操作:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
public class FilesBasicDemo {
public static void main(String[] args) throws IOException {
Path filePath = Paths.get("D:/test/newFile.txt");
// 判断文件是否存在
boolean exists = Files.exists(filePath);
System.out.println("文件是否存在:" + exists);
// 创建文件,如果父目录不存在需要先创建父目录
if (!exists) {
// 先创建父目录
Path parentDir = filePath.getParent();
if (!Files.exists(parentDir)) {
Files.createDirectories(parentDir);
}
Files.createFile(filePath);
System.out.println("文件创建成功");
}
// 删除文件
Files.delete(filePath);
System.out.println("文件删除成功");
}
}
文件读写操作
Files类提供了直接读取和写入文件内容的方法,支持按行读取、一次性读取全部字节、写入字符串或字节数组等场景,不需要手动处理流关闭。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.io.IOException;
public class FilesReadWriteDemo {
public static void main(String[] args) throws IOException {
Path filePath = Paths.get("D:/test/content.txt");
// 写入字符串到文件
String content = "这是测试内容n第二行内容";
Files.write(filePath, content.getBytes());
// 按行读取文件内容
List<String> lines = Files.readAllLines(filePath);
System.out.println("文件内容:");
for (String line : lines) {
System.out.println(line);
}
// 读取全部字节
byte[] allBytes = Files.readAllBytes(filePath);
System.out.println("全部字节长度:" + allBytes.length);
}
}
文件复制与移动
Files类的copy和move方法可以轻松完成文件的复制和移动(重命名)操作,支持指定复制选项,比如覆盖已存在文件。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.io.IOException;
public class FilesCopyMoveDemo {
public static void main(String[] args) throws IOException {
Path source = Paths.get("D:/test/source.txt");
Path target = Paths.get("D:/test/target.txt");
// 复制文件,如果目标文件存在则覆盖
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件复制成功");
// 移动文件(重命名)
Path newPath = Paths.get("D:/test/newName.txt");
Files.move(target, newPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件移动成功");
}
}
目录遍历操作
Files类支持遍历目录下的所有文件,包括递归遍历子目录,不需要手动编写递归逻辑,通过walk方法就可以实现。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
public class FilesWalkDemo {
public static void main(String[] args) throws IOException {
Path dirPath = Paths.get("D:/test");
// 递归遍历目录下所有文件,深度为2(最多遍历两层子目录)
Files.walk(dirPath, 2)
.filter(Files::isRegularFile) // 过滤出普通文件,排除目录
.forEach(path -> System.out.println("文件路径:" + path));
}
}
使用注意事项
使用Paths和Files类时,所有操作都可能抛出IOException,需要做好异常处理,要么在方法上抛出该异常,要么用try-catch块捕获处理。
Path对象只是路径的抽象表示,不会校验路径对应的文件或目录是否真实存在,只有调用Files类的具体操作方法时才会校验实际文件系统状态。
Files的读写方法适合处理中小文件,如果处理大文件,建议使用Files的newBufferedReader和newBufferedWriter方法获取流,分批次处理内容,避免内存溢出。