一、依赖:
<!--Hutool Java工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.5</version>
</dependency>
二、常用方法
Hutool 是一个 Java 工具类库,其中的 FileUtil 提供了丰富的文件操作工具方法。以下是 FileUtil 的常用方法及示例:
1. 文件/目录基本操作
创建文件
// 创建文件,如果父目录不存在也自动创建
File file = FileUtil.touch("/path/to/file.txt");
// 创建目录
FileUtil.mkdir("/path/to/dir");
判断文件类型
// 判断是否为文件
boolean isFile = FileUtil.isFile("/path/to/file.txt");
// 判断是否为目录
boolean isDir = FileUtil.isDirectory("/path/to/dir");
// 判断文件是否存在
boolean exists = FileUtil.exist("/path/to/file");
2. 文件读写操作
读取文件内容
// 读取文件为字符串(默认UTF-8编码)
String content = FileUtil.readUtf8String("/path/to/file.txt");
// 按行读取文件
List<String> lines = FileUtil.readUtf8Lines("/path/to/file.txt");
// 读取文件为字节数组
byte[] bytes = FileUtil.readBytes("/path/to/file.bin");
写入文件内容
// 写入字符串到文件(覆盖模式)
FileUtil.writeUtf8String("Hello World", "/path/to/file.txt");
// 追加内容到文件
FileUtil.appendUtf8String("Append content", "/path/to/file.txt");
// 写入字节数组到文件
FileUtil.writeBytes(bytes, "/path/to/file.bin");
3. 文件复制/移动/删除
复制文件/目录
// 复制文件
FileUtil.copy("/path/to/src.txt", "/path/to/dest.txt", true); // 第三个参数表示是否覆盖
// 复制目录
FileUtil.copyContent("/path/to/srcDir", "/path/to/destDir", true);
移动/重命名文件
// 移动文件
FileUtil.move("/path/to/src.txt", "/path/to/dest.txt", true);
// 重命名文件
FileUtil.rename(file, "newName.txt", true);
删除文件/目录
// 删除文件
FileUtil.del("/path/to/file.txt");
// 清空目录(不删除目录本身)
FileUtil.clean("/path/to/dir");
// 删除目录(包括子目录和文件)
FileUtil.del("/path/to/dir");
4. 文件信息获取
获取文件信息
// 获取文件扩展名
String extName = FileUtil.extName("test.txt"); // 返回 "txt"
// 获取文件名(不带扩展名)
String fileName = FileUtil.mainName("test.txt"); // 返回 "test"
// 获取文件大小
long size = FileUtil.size(file); // 返回字节数
// 获取文件最后修改时间
long lastModified = FileUtil.lastModifiedTime("/path/to/file.txt");
遍历目录
// 遍历目录下的文件和子目录
File[] files = FileUtil.ls("/path/to/dir");
// 递归遍历目录下的所有文件
List<File> fileList = FileUtil.loopFiles("/path/to/dir");
// 过滤查找文件
List<File> files = FileUtil.loopFiles("/path/to/dir",
pathname -> pathname.getName().endsWith(".txt"));
5. 路径操作
// 获取绝对路径
String absolutePath = FileUtil.getAbsolutePath("relative/path");
// 规范化路径(去除多余的.和..)
String normalizedPath = FileUtil.normalize("/path/to/../file.txt");
// 获取临时目录路径
File tempDir = FileUtil.getTmpDir();
// 获取用户主目录
File homeDir = FileUtil.getUserHomeDir();
6. 文件类型判断
// 判断是否为图片文件
boolean isImage = FileUtil.isImage("/path/to/image.jpg");
// 判断是否为视频文件
boolean isVideo = FileUtil.isVideo("/path/to/video.mp4");
7. 其他实用方法
// 获取文件输入流
InputStream inputStream = FileUtil.getInputStream("/path/to/file.txt");
// 获取文件输出流
OutputStream outputStream = FileUtil.getOutputStream("/path/to/file.txt");
// 获取文件Reader
BufferedReader reader = FileUtil.getUtf8Reader("/path/to/file.txt");
// 获取文件Writer
BufferedWriter writer = FileUtil.getUtf8Writer("/path/to/file.txt");
// 计算文件MD5
String md5 = FileUtil.md5("/path/to/file.txt");
三、更多实用方法详解
除了之前介绍的基本功能外,Hutool的FileUtil还提供了许多其他实用的文件操作方法。以下是更全面的方法分类和示例:
1. 文件路径处理
路径拼接与解析
// 路径拼接(自动处理路径分隔符)
String fullPath = FileUtil.normalize("/path/to" + "/" + "file.txt");
// 构建File对象(自动处理路径分隔符)
File file = FileUtil.file("/path", "to", "file.txt");
// 获取父目录
File parentDir = FileUtil.getParent("/path/to/file.txt", 1);
// 获取相对路径
String relativePath = FileUtil.subPath("/path/to", "/path/to/file.txt");
路径转换
// 转换为URL
URL url = FileUtil.getURL("/path/to/file.txt");
// 转换为URI
URI uri = FileUtil.toURI("/path/to/file.txt");
// Windows路径转Linux风格
String linuxPath = FileUtil.normalize("C:\\path\\to\\file.txt");
2. 文件监控
// 简单文件监听
FileUtil.watch("/path/to/dir", new SimpleFileListener(){
@Override
public void onModify(File file){
System.out.println("文件被修改: " + file.getName());
}
});
3. 文件比较与校验
// 比较文件内容是否相同
boolean isSame = FileUtil.contentEquals(file1, file2);
// 计算文件CRC32校验码
long crc32 = FileUtil.checksumCRC32("/path/to/file.txt");
// 计算文件SHA1哈希值
String sha1 = FileUtil.sha1("/path/to/file.txt");
// 计算文件SHA256哈希值
String sha256 = FileUtil.sha256("/path/to/file.txt");
4. 文件过滤与查找
// 查找指定扩展名的文件
List<File> files = FileUtil.loopFiles("/path/to/dir",
file -> file.getName().endsWith(".txt"));
// 查找空目录
List<File> emptyDirs = FileUtil.loopFiles("/path/to/dir",
File::isDirectory,
dir -> dir.list().length == 0);
// 查找最近修改的文件
File newestFile = FileUtil.loopFiles("/path/to/dir").stream()
.max(Comparator.comparingLong(File::lastModified))
.orElse(null);
5. 文件压缩与解压
// 压缩文件/目录为ZIP
File zipFile = FileUtil.zip("/path/to/source", "/path/to/target.zip");
// 解压ZIP文件
FileUtil.unzip("/path/to/source.zip", "/path/to/targetDir");
// 压缩为GZIP
File gzipFile = FileUtil.gzip("/path/to/source.txt");
// 解压GZIP
FileUtil.unGzip("/path/to/source.gz", "/path/to/target.txt");
6. 特殊文件操作
大文件处理
// 大文件逐行处理
FileUtil.readLines(file, CharsetUtil.UTF_8, line -> {
System.out.println(line);
return true; // 返回false可中断读取
});
// 大文件分片读取
FileUtil.readBytes(file, (bytes, length) -> {
// 处理读取到的字节片段
return true; // 返回false可中断读取
});
文件加锁
// 获取文件锁
FileLock lock = FileUtil.getFileLock(file);
try {
// 操作文件
} finally {
FileUtil.releaseFileLock(lock);
}
7. 文件编码检测与转换
// 检测文件编码
Charset charset = FileUtil.getCharset("/path/to/file.txt");
// 转换文件编码
FileUtil.convertCharset("/path/to/src.txt",
CharsetUtil.ISO_8859_1,
CharsetUtil.UTF_8,
"/path/to/dest.txt");
8. 系统相关文件操作
// 获取系统临时目录文件
File tmpFile = FileUtil.createTempFile();
// 获取类路径下的文件
File classpathFile = FileUtil.file(FileUtil.getClassPath());
// 获取Jar包内的文件
File jarFile = FileUtil.getJarFile(SomeClass.class);
9. 文件属性操作
// 设置文件只读
FileUtil.setReadOnly(file, true);
// 设置文件隐藏属性(Windows系统)
FileUtil.setHidden(file, true);
// 设置文件最后修改时间
FileUtil.setLastModifiedTime(file, System.currentTimeMillis());
10. 批量文件操作
// 批量重命名文件
FileUtil.rename("/path/to/dir",
fileName -> fileName.replace("old", "new"),
false); // 是否递归子目录
// 批量修改文件扩展名
FileUtil.renameExt("/path/to/dir", "txt", "bak");
11. 文件系统信息
// 获取磁盘总空间
long totalSpace = FileUtil.getTotalSpace("/");
// 获取磁盘可用空间
long freeSpace = FileUtil.getFreeSpace("/");
// 获取文件系统根目录
File[] roots = FileUtil.getRoots();
12. 特殊用途方法
文件合并与分割
// 合并多个文件
FileUtil.concat("/path/to/part1.txt",
"/path/to/part2.txt",
"/path/to/merged.txt");
// 分割文件
FileUtil.split("/path/to/largefile.txt", "/path/to/outputDir", 1024 * 1024); // 1MB每个
文件尾行读取
// 读取文件最后几行
List<String> lastLines = FileUtil.tail("/path/to/log.txt", 10);
文件差异比较
// 比较两个文件的差异
List<String> diffLines = FileUtil.diff("/path/to/file1.txt", "/path/to/file2.txt");