一、Commons-io 介绍
Apache Commons IO 是 Apache 提供的第三方 IO 工具包,封装大量 IO、文件操作工具方法,简化原生 Java IO/File 繁琐代码,不用手写递归遍历、文件拷贝、关闭流等重复代码。
原生 File 和 IO 流代码量大、容易忘关闭流、递归写起来麻烦;Commons-io 帮我们封装好了。
1. 依赖导入(Maven)
XML
<!-- commons-io 依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
如果是普通 Java 项目:下载
commons-io-2.11.0.jar,添加到项目库(创建lib包)。
二、核心三大类
- FileUtils:文件 / 文件夹操作(最常用)
- IOUtils:流操作工具类
- FilenameUtils :文件名、路径字符串处理,不操作磁盘真实文件,只处理字符串
三、FileUtils 常用 API(重点)
1. 文件拷贝
java
import org.apache.commons.io.FileUtils;
import java.io.File;
public class Test {
public static void main(String[] args) throws Exception {
File src = new File("D:/test/1.jpg");
File dest = new File("D:/test/copy.jpg");
// 复制单个文件
FileUtils.copyFile(src, dest);
}
}
copyFile(srcFile, destFile):复制文件,目标文件不存在自动创建;存在直接覆盖copyFileToDirectory(src, destDir):把文件复制到目标文件夹
2. 文件夹拷贝(自带递归!不用自己写递归)
java
File srcDir = new File("D:/test");
File destDir = new File("D:/test2");
// 复制整个文件夹(包含里面所有子文件、子文件夹)
FileUtils.copyDirectory(srcDir, destDir);
✅ 原生 Java 要手写递归遍历 File;这个一行搞定多级目录复制。
3. 删除文件夹(递归删除)
java
File dir = new File("D:/test2");
FileUtils.deleteDirectory(dir);
⚠️ 注意:deleteDirectory 可以删除非空文件夹 ,原生
file.delete()只能删空文件夹!面试高频对比点。
4. 读取文件内容
java
File file = new File("D:/a.txt");
// 一次性读取全部文本,返回字符串
String content = FileUtils.readFileToString(file, "UTF-8");
System.out.println(content);
// 读取文件按行,返回List<String>
List<String> lines = FileUtils.readLines(file, "UTF-8");
5. 写入文件
java
File file = new File("D:/a.txt");
// 写入内容,覆盖原有内容
FileUtils.writeStringToFile(file, "hello commons io", "UTF-8");
// 追加写入,第三个参数true代表追加
FileUtils.writeStringToFile(file, "\n追加内容", "UTF-8", true);
6. 其他常用
FileUtils.sizeOf(file):获取文件 / 文件夹总大小(字节)FileUtils.listFiles():递归查找指定后缀文件(替代手写递归搜索文件)
java
File dir = new File("D:/test");
// 参数:目录,文件后缀数组,是否递归子目录
Collection<File> files = FileUtils.listFiles(dir, new String[]{"txt","jpg"}, true);
for(File f : files){
System.out.println(f);
}
四、IOUtils 流工具类
专门简化 InputStream、OutputStream、Reader、Writer 操作
- 流拷贝
java
// 把输入流数据复制到输出流
IOUtils.copy(inputStream, outputStream);
- 读取流全部内容
java
String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
✅ IOUtils 还封装了流关闭方法,旧版本:
IOUtils.closeQuietly(),静默关闭流,不用 try-catch。 ⚠️ 新版本推荐 try-with-resources,closeQuietly 已经废弃。
五、FilenameUtils:路径字符串处理
不会操作磁盘文件!只处理路径字符串
java
String path = "D:/demo/1.txt";
// 获取文件名:1.txt
String name = FilenameUtils.getName(path);
// 获取后缀:txt
String ext = FilenameUtils.getExtension(path);
// 获取不带后缀名称:1
String base = FilenameUtils.getBaseName(path);
六、面试考点总结
- Commons-io 是第三方工具包,不是 JDK 原生,需要导入 jar/maven 依赖。
FileUtils.copyDirectory():递归复制整个目录;FileUtils.deleteDirectory()递归删除非空文件夹。原生 File.delete () 只能删除空文件夹。FileUtils.listFiles():可以递归检索指定后缀文件,替代手写递归。- FileUtils:操作真实磁盘文件;FilenameUtils:只处理路径字符串,不访问磁盘。
- IOUtils:简化 IO 流读写。
七、易错点
⚠️ 所有 FileUtils 读写方法都会抛出异常,需要 throws 或者 try-catch 捕获 IOException ⚠️ 删除操作deleteDirectory很危险,测试时不要写系统目录! ⚠️ 不要混淆:FileUtils.forceDelete() 和 deleteDirectory(),都可以删非空目录。
八、对比原生 IO
原生 IO:手写 while 循环读写、手动关闭流、文件夹拷贝需要自己写递归 File 遍历,代码冗长。 Commons-io:一行 API 完成文件拷贝、递归查找、文件夹删除,开发效率高。