目录
FileUtils
提供文件及目录操作的常用方法。
方法名 | 描述 |
---|---|
copyFile(File src, File dest) | 复制文件到目标路径。 |
copyFileToDirectory(File src, File dir) | 复制文件到指定目录。 |
copyDirectory(File srcDir, File destDir) | 递归复制整个目录。 |
copyDirectoryToDirectory(File srcDir, File destDir) | 复制目录到目标目录下。 |
deleteDirectory(File dir) | 递归删除目录及其内容。 |
deleteQuietly(File file) | 静默删除文件或目录(忽略异常)。 |
readFileToString(File file, Charset encoding) | 读取文件内容为字符串。 |
readLines(File file, Charset encoding) | 读取文件内容为字符串列表(按行分割)。 |
writeStringToFile(File file, String data, Charset encoding) | 将字符串写入文件。 |
writeLines(File file, Collection<?> lines) | 将集合内容按行写入文件。 |
forceMkdir(File dir) | 强制创建目录(包括父目录)。 |
sizeOf(File file) | 计算文件或目录的大小(字节)。 |
sizeOfDirectory(File dir) | 计算目录的总大小。 |
moveFile(File src, File dest) | 移动文件到目标路径。 |
moveToDirectory(File src, File dir, boolean createDir) | 移动文件或目录到指定目录。 |
touch(File file) | 创建空文件或更新文件修改时间。 |
cleanDirectory(File dir) | 清空目录内容(保留目录本身)。 |
contentEquals(File file1, File file2) | 比较两个文件内容是否相同。 |
checksum(File file, Checksum checksum) | 计算文件的校验和。 |
iterateFiles(File dir, String[] extensions, boolean recursive) | 遍历目录中指定扩展名的文件。 |
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class FileUtilsExample {
public static void main(String[] args) {
try {
// 复制文件
File srcFile = new File("source.txt");
File destFile = new File("dest.txt");
FileUtils.copyFile(srcFile, destFile);
System.out.println("文件复制成功!");
// 读取文件内容
String content = FileUtils.readFileToString(destFile, StandardCharsets.UTF_8);
System.out.println("文件内容:\n" + content);
} catch (IOException e) {
System.err.println("操作失败: " + e.getMessage());
}
}
}
IOUtils
处理 I/O 流、读写操作的通用方法。
方法名 | 描述 |
---|---|
copy(InputStream input, OutputStream output) | 将输入流内容复制到输出流。 |
copyLarge(InputStream input, OutputStream output) | 复制大文件流(支持长字节)。 |
toByteArray(InputStream input) | 将输入流转换为字节数组。 |
toString(InputStream input, Charset encoding) | 将输入流内容转换为字符串。 |
readLines(InputStream input, Charset encoding) | 按行读取输入流内容为字符串列表。 |
write(byte[] data, OutputStream output) | 将字节数组写入输出流。 |
write(String data, OutputStream output, Charset encoding) | 将字符串写入输出流。 |
closeQuietly(Closeable closeable) | 静默关闭资源(忽略异常,已过时)。 |
close(Closeable closeable) | 关闭资源并抛出可能的异常。 |
readFully(InputStream input, int length) | 从输入流中精确读取指定长度的字节。 |
toInputStream(String input, Charset encoding) | 将字符串转换为输入流。 |
copy(Reader reader, Writer writer) | 将字符流内容复制到输出字符流。 |
buffer(InputStream input) | 将输入流包装为缓冲流(推荐替代手动缓冲)。 |
import org.apache.commons.io.IOUtils;
import java.io.*;
public class IOUtilsExample {
public static void main(String[] args) {
try (
InputStream in = new FileInputStream("input.txt");
OutputStream out = new FileOutputStream("output.txt")
) {
// 复制流
IOUtils.copy(in, out);
System.out.println("流复制完成!");
// 将字符串写入输出流
String data = "Hello, Commons IO!";
IOUtils.write(data, out, StandardCharsets.UTF_8);
} catch (IOException e) {
System.err.println("IO错误: " + e.getMessage());
}
}
}
FilenameUtils
处理文件路径和名称的规范化与转换。
方法名 | 描述 |
---|---|
concat(String basePath, String fullPath) | 拼接两个路径(自动处理分隔符)。 |
getExtension(String filename) | 获取文件扩展名(不带.)。 |
removeExtension(String filename) | 移除文件名的扩展名。 |
normalize(String filename) | 规范化路径(处理.、…和多余分隔符)。 |
separatorsToUnix(String path) | 将路径分隔符转换为 Unix 风格(/)。 |
separatorsToWindows(String path) | 将路径分隔符转换为 Windows 风格(\)。 |
getFullPath(String filename) | 获取文件的完整路径(不含文件名)。 |
getName(String filename) | 获取文件名(含扩展名,不含路径)。 |
isExtension(String filename, String extension) | 检查文件是否具有指定扩展名。 |
import org.apache.commons.io.FilenameUtils;
public class FilenameUtilsExample {
public static void main(String[] args) {
String fullPath = FilenameUtils.concat("/base/path", "subdir/file.txt");
System.out.println("拼接路径: " + fullPath); // 输出: /base/path/subdir/file.txt
String extension = FilenameUtils.getExtension("document.pdf");
System.out.println("文件扩展名: " + extension); // 输出: pdf
}
}
FileSystemUtils
提供文件系统相关工具方法。
方法名 | 描述 |
---|---|
freeSpaceKb(String path) | 获取指定路径的可用空间(单位:KB)。 |
LineIterator
逐行读取文件的迭代器工具。
方法名 | 描述 |
---|---|
hasNext() | 检查是否还有下一行。 |
nextLine() | 获取下一行内容。 |
close() | 关闭底层流资源。 |
EndianUtils
处理字节序(大端序、小端序)转换的工具类。
方法名 | 描述 |
---|---|
swapShort(short value) | 交换 short 类型的字节序。 |
swapInteger(int value) | 交换 int 类型的字节序。 |
swapLong(long value) | 交换 long 类型的字节序。 |
readSwappedShort(byte[] data, int offset) | 从字节数组中按小端序读取 short 值。 |
writeSwappedInteger(byte[] data, int offset, int value) | 按小端序将 int 值写入字节数组。 |
import org.apache.commons.io.EndianUtils;
public class EndianExample {
public static void main(String[] args) {
int original = 0x12345678;
int swapped = EndianUtils.swapInteger(original);
System.out.printf("原始值: 0x%x, 转换后: 0x%x\n", original, swapped); // 输出: 0x12345678 → 0x78563412
byte[] buffer = new byte[4];
EndianUtils.writeSwappedInteger(buffer, 0, original);
System.out.println("写入的字节: " + bytesToHex(buffer)); // 输出: 78 56 34 12
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X ", b));
}
return sb.toString().trim();
}
}
FileCleaningTracker
用于跟踪和自动删除临时文件的工具类。
方法名 | 描述 |
---|---|
track(File file, Object marker) | 注册文件,当标记对象被垃圾回收时删除文件。 |
exitWhenFinished() | 等待所有跟踪文件删除完成后退出。 |
Streams
提供简单流操作的补充方法(部分与 IOUtils 重叠)。
方法名 | 描述 |
---|---|
copy(InputStream input, OutputStream output, boolean closeInput) | 复制流,可选择是否关闭输入流。 |
readLines(InputStream input) | 按默认编码读取输入流为字符串列表。 |
FileFilterUtils
组合文件过滤器的工具类。
方法名 | 描述 |
---|---|
and(IOFileFilter… filters) | 逻辑“与”组合多个过滤器。 |
or(IOFileFilter… filters) | 逻辑“或”组合多个过滤器。 |
not(IOFileFilter filter) | 逻辑“非”反转过滤器条件。 |
nameFileFilter(String… names) | 过滤指定文件名的文件。 |
suffixFileFilter(String… suffixes) | 过滤指定后缀名的文件。 |
sizeFileFilter(long size, boolean acceptLarger) | 按文件大小过滤文件。 |
ageFileFilter(long cutoffMillis, boolean acceptOlder) | 按文件修改时间过滤文件。 |
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import java.io.File;
public class FileFilterExample {
public static void main(String[] args) {
File dir = new File("search_dir");
// 定义过滤器(查找大于 1KB 的 .txt 文件)
IOFileFilter txtFilter = FileFilterUtils.suffixFileFilter(".txt");
IOFileFilter sizeFilter = FileFilterUtils.sizeFileFilter(1024, true);
IOFileFilter combinedFilter = FileFilterUtils.and(txtFilter, sizeFilter);
File[] files = dir.listFiles(combinedFilter);
if (files != null) {
for (File file : files) {
System.out.println("找到文件: " + file.getName());
}
}
}
}
PathUtils
处理路径字符串的工具类(与 FilenameUtils 互补)。
方法名 | 描述 |
---|---|
getPath(String… entries) | 安全拼接路径片段(自动处理分隔符)。 |
toFile(String… pathComponents) | 将路径片段转换为 File 对象。 |
CountingInputStream / CountingOutputStream
统计读取或写入字节数的代理流。
方法名 | 描述 |
---|---|
getByteCount() | 获取已处理的字节总数。 |
resetByteCount() | 重置字节计数器。 |
Tailer
实时监听文件尾部内容变化的工具类。
方法名 | 描述 |
---|---|
run() | 启动监听线程。 |
stop() | 停止监听线程。 |
import org.apache.commons.io.input.Tailer;
import org.apache.commons.io.input.TailerListenerAdapter;
import java.io.File;
public class TailerExample {
public static void main(String[] args) {
File logFile = new File("app.log");
TailerListener listener = new TailerListenerAdapter() {
@Override
public void handle(String line) {
System.out.println("新的日志: " + line);
}
};
// 创建 Tailer(每隔 1 秒检查一次)
Tailer tailer = Tailer.create(logFile, listener, 1000);
// 保持主线程运行(实际应用中可能需要线程管理)
try {
Thread.sleep(60000); // 监听 60 秒
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
tailer.stop();
}
}
}
ComparableFile
增强的 File 类,支持直接比较文件内容。
方法名 | 描述 |
---|---|
contentEquals(ComparableFile other) | 比较两个文件内容是否相同。 |
CharSequenceReader / CharSequenceInputStream
将字符串或字符序列转换为流。
方法名 | 描述 |
---|---|
read() | 按字符或字节读取内容。 |
FileAlterationMonitor
监听文件系统变化的工具类。
方法名 | 描述 |
---|---|
start() | 启动监听服务。 |
stop() | 停止监听服务。 |
其他辅助工具
- AutoCloseInputStream:自动关闭底层资源的输入流。
- BOMInputStream:处理 Unicode 字节顺序标记(BOM)。
- TeeInputStream:将输入流同时写入多个输出流。
- NullOutputStream:模拟“黑洞”输出流(丢弃所有写入内容)。
注意事项
- 流资源管理:优先使用 try-with-resources 替代 closeQuietly(后者已过时)。
- 性能优化:处理大文件时推荐使用 copyLarge 或缓冲流。
- 线程安全:Tailer 和 FileAlterationMonitor 需注意多线程同步问题。
- 版本兼容性:部分方法在不同 Commons IO 版本中可能行为不同(如路径规范化逻辑)。