Java NIO包下的Files工具类是处理文件操作的高效工具,它封装了大量静态方法,覆盖了文件生命周期中的各类常见操作,开发者无需手动编写繁琐的流处理逻辑,就能完成文件的各类操作任务。

Files工具类的基础准备
使用Files工具类前需要先了解Path接口,它是Files工具类所有方法的入参基础,代表文件或目录的路径。可以通过Paths工具类的get方法快速创建Path实例,示例代码如下:
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileDemo {
public static void main(String[] args) {
// 创建表示当前目录下test.txt文件的Path对象
Path filePath = Paths.get("test.txt");
// 创建表示绝对路径的Path对象
Path absolutePath = Paths.get("D:/project/data.txt");
System.out.println("文件路径:" + filePath);
System.out.println("绝对路径:" + absolutePath);
}
}
常用文件操作方法
文件创建与写入
Files工具类提供了createFile方法创建新文件,write方法写入文件内容,写入时会自动创建父目录,不需要手动处理目录不存在的问题。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class CreateFileDemo {
public static void main(String[] args) throws Exception {
Path filePath = Paths.get("demo.txt");
// 创建新文件,如果文件已存在会抛出异常
Files.createFile(filePath);
// 写入字符串内容到文件
String content = "这是写入的测试内容";
Files.write(filePath, content.getBytes());
// 写入多行内容
List<String> lines = Arrays.asList("第一行内容", "第二行内容", "第三行内容");
Files.write(filePath, lines);
}
}
文件读取
读取文件内容可以使用readAllBytes读取全部字节,或者readAllLines按行读取内容,两种方式都无需手动关闭流资源。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class ReadFileDemo {
public static void main(String[] args) throws Exception {
Path filePath = Paths.get("demo.txt");
// 读取全部字节并转为字符串
byte[] fileBytes = Files.readAllBytes(filePath);
String allContent = new String(fileBytes);
System.out.println("全部内容:" + allContent);
// 按行读取文件内容
List<String> lineList = Files.readAllLines(filePath);
for (int i = 0; i < lineList.size(); i++) {
System.out.println("第" + (i + 1) + "行:" + lineList.get(i));
}
}
}
文件复制、移动与删除
Files工具类提供了copy复制文件、move移动文件、delete删除文件的方法,操作时会自动处理文件的读写逻辑。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class FileOperateDemo {
public static void main(String[] args) throws Exception {
Path sourcePath = Paths.get("demo.txt");
Path targetCopyPath = Paths.get("demo_copy.txt");
Path targetMovePath = Paths.get("D:/demo_move.txt");
// 复制文件,如果目标文件存在则替换
Files.copy(sourcePath, targetCopyPath, StandardCopyOption.REPLACE_EXISTING);
// 移动文件到指定目录,如果目标文件存在则替换
Files.move(sourcePath, targetMovePath, StandardCopyOption.REPLACE_EXISTING);
// 删除文件,如果文件不存在会抛出异常
Files.delete(targetCopyPath);
}
}
文件属性与判断操作
Files工具类还提供了大量判断文件属性、获取文件信息的方法,比如判断文件是否存在、是否是目录、获取文件大小等。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
public class FileAttributeDemo {
public static void main(String[] args) throws Exception {
Path filePath = Paths.get("D:/demo_move.txt");
// 判断文件是否存在
boolean exists = Files.exists(filePath);
System.out.println("文件是否存在:" + exists);
// 判断是否是普通文件
boolean isFile = Files.isRegularFile(filePath);
System.out.println("是否是普通文件:" + isFile);
// 判断是否是目录
boolean isDirectory = Files.isDirectory(filePath);
System.out.println("是否是目录:" + isDirectory);
// 获取文件基础属性
BasicFileAttributes attributes = Files.readAttributes(filePath, BasicFileAttributes.class);
System.out.println("文件大小:" + attributes.size() + "字节");
System.out.println("创建时间:" + attributes.creationTime());
}
}
注意事项
- Files工具类的方法大多会抛出IOException,实际使用时需要做好异常处理,或者通过throws关键字向上抛出。
- 操作文件前建议先通过
Files.exists判断文件是否存在,避免操作不存在的文件导致异常。 - 复制、移动文件时如果需要覆盖已存在的目标文件,需要显式传入
StandardCopyOption.REPLACE_EXISTING参数。 - 处理大文件时,不建议使用
readAllBytes一次性读取全部内容,避免占用过多内存,可以结合流的方式分段读取。