Java文件处理效率库Commons-IO(速览)
一、工具介绍
Commons是apache开源基金组织提供的工具包,里面有很多帮助我们提高开发效率的API。比如:
复制代码
StringUtils 字符串工具类 NumberUtils 数字工具类 ArrayUtils 数组工具类 RandomUtils 随机数工具类 DateUtils 日期工具类 StopWatch 秒表工具类 ClassUtils 反射工具类 SystemUtils 系统工具类 MapUtils 集合工具类 Beanutils bean工具类 Commons-io io的工具类
其中:Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包。作用:提高IO流的开发效率。
二、使用方式
lib方式引入
1、新建lib文件夹
2、把第三方jar包粘贴到文件夹中
3、右键点击add as a library
代码示例:
复制代码
public class CommonsIODemo1 { public static void main (String[] args) throws IOException { /* FileUtils类 static void copyFile(File srcFile, File destFile) 复制文件 static void copyDirectory(File srcDir, File destDir) 复制文件夹 static void copyDirectoryToDirectory(File srcDir, File destDir) 复制文件夹 static void deleteDirectory(File directory) 删除文件夹 static void cleanDirectory(File directory) 清空文件夹 static String readFileToString(File file, Charset encoding) 读取文件中的数据变成成字符串 static void write(File file, CharSequence data, String encoding) 写出数据 IOUtils类 public static int copy(InputStream input, OutputStream output) 复制文件 public static int copyLarge(Reader input, Writer output) 复制大文件 public static String readLines(Reader input) 读取数据 public static void write(String data, OutputStream output) 写出数据 */ /* File src = new File("myio\\a.txt"); File dest = new File("myio\\copy.txt"); FileUtils.copyFile(src,dest);*/ /*File src = new File("D:\\aaa"); File dest = new File("D:\\bbb"); FileUtils.copyDirectoryToDirectory(src,dest);*/ /*File src = new File("D:\\bbb"); FileUtils.cleanDirectory(src);*/ } }
maven方式引入
复制代码
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency>
三、常用核心工具类概览
| 工具类名 |
主要功能说明 |
| IOUtils |
流(InputStream/OutputStream/Reader/Writer)操作工具,如复制、读取、关闭等 |
| FileUtils |
文件和目录级别的操作,如复制、移动、删除、读写等 |
| FilenameUtils |
文件名和路径字符串的解析与处理(不涉及实际文件系统) |
| FileFilterUtils |
提供多种文件过滤器(FileFilter),用于 筛选 符合条件的文件 |
| FileSystemUtils |
获取文件系统的相关信息(如 磁盘 空间) |
| LineIterator |
逐行读取文件内容的迭代器工具 |
| FileDeleteStrategy |
提供更灵活的文件删除策略 |
| EndianUtils |
字节序转换工具(适用于处理二进制数据) |
| Charsets |
提供标准字符集常量(如 UTF_8) |
| CopyStreamException / CopyStreamListener / CopyStreamEvent |
支持带 进度监听 的流复制 |
四、IOUtils(数据相关)
拷贝方法
| 方法 |
作用描述 |
操作对象 |
| copy(InputStream input, OutputStream output) |
将输入流复制到输出流(默认缓冲区) |
InputStream → OutputStream |
| copy(InputStream input, OutputStream output, int bufferSize) |
带指定缓冲区大小的复制 |
InputStream → OutputStream |
| copy(InputStream input, Writer output, String inputEncoding) |
输入流转为字符写入Writer(需编码) |
InputStream → Writer |
| copy(Reader input, Writer output) |
Reader内容复制到Writer |
Reader → Writer |
| copy(Reader input, OutputStream output, String outputEncoding) |
Reader写入OutputStream(需编码) |
Reader → OutputStream |
copyLarge 用于处理大文件或大数据流(如超过2GB)
| 方法 |
作用描述 |
操作对象 |
| copyLarge(Reader input, Writer output) |
使用4KB缓冲区复制大文本流 |
Reader → Writer |
| copyLarge(Reader input, Writer output, char[] buffer) |
自定义缓冲区复制大文本流 |
Reader → Writer |
输入流转字符串/字节数组
| 方法 |
作用描述 |
操作对象 |
| toString(Reader input) |
读取整个Reader为字符串 |
Reader |
| toString(byte[] input, String encoding) |
字节数组转字符串(指定编码) |
byte[] |
| toString(InputStream input, Charset encoding) |
输入流转字符串 |
InputStream |
| toString(InputStream input, String encoding) |
同上,使用字符串编码 |
InputStream |
| toString(URI uri, String encoding) |
URI资源内容转字符串 |
URI |
| toString(URL url, String encoding) |
URL资源内容转字符串 |
URL |
| 方法 |
作用描述 |
操作对象 |
| toByteArray(InputStream input) |
输入流转为字节数组 |
InputStream |
| toByteArray(InputStream input, int size) |
指定大小读取为字节数组 |
InputStream |
| toByteArray(URI uri) |
URI资源内容转为字节数组 |
URI |
| toByteArray(URL url) |
URL资源内容转为字节数组 |
URL |
| toByteArray(URLConnection urlConn) |
网络连接内容转为字节数组 |
URLConnection |
| toByteArray(Reader input, String encoding) |
Reader内容转为字节数组(需编码) |
Reader |
行读写操作
| 方法 |
作用描述 |
操作对象 |
| readLines(Reader input) |
按行读取所有内容返回List |
Reader |
| readLines(InputStream input, Charset encoding) |
按行读取返回List |
InputStream |
| readLines(InputStream input, String encoding) |
同上,使用字符串编码 |
InputStream |
| 方法 |
作用描述 |
操作对象 |
| writeLines(Collection<?> lines, String lineEnding, Writer writer) |
写入多行,指定换行符 |
Collection |
| writeLines(Collection<?> lines, String lineEnding, OutputStream output, Charset encoding) |
写入多行并指定编码 |
Collection |
| writeLines(Collection<?> lines, String lineEnding, OutputStream output, String encoding) |
同上,使用字符串编码 |
Collection |
流读取操作
| 方法 |
作用描述 |
操作对象 |
| read(InputStream input, byte[] buffer) |
从流中读取数据到buffer |
InputStream |
| read(InputStream input, byte[] buffer, int offset, int length) |
指定偏移和长度读取 |
InputStream |
| read(Reader input, char[] buffer) |
从字符流读取到char数组 |
Reader |
| read(Reader input, char[] buffer, int offset, int length) |
指定偏移和长度读取 |
Reader |
| 方法 |
作用描述 |
操作对象 |
| readFully(InputStream input, int length) |
读取指定长度的数据,不足抛异常 |
InputStream |
| readFully(InputStream input, byte[] buffer) |
完全填满buffer,否则抛异常 |
InputStream |
| readFully(InputStream input, byte[] buffer, int offset, int length) |
指定范围填满buffer |
InputStream |
| readFully(Reader input, char[] buffer) |
完全填满char数组 |
Reader |
| readFully(Reader input, char[] buffer, int offset, int length) |
指定范围填满char数组 |
Reader |
写入操作
| 方法 |
作用描述 |
操作对象 |
| write(byte[] data, OutputStream output) |
写入字节数组到输出流 |
OutputStream |
| write(byte[] data, Writer output, Charset encoding) |
字节转字符写入Writer |
Writer |
| write(byte[] data, Writer output, String encoding) |
同上,使用字符串编码 |
Writer |
| write(char[] data, Writer output) |
写入字符数组到Writer |
Writer |
| write(char[] data, OutputStream output, Charset encoding) |
转字节后写入输出流 |
OutputStream |
| write(char[] data, OutputStream output, String encoding) |
同上,使用字符串编码 |
OutputStream |
| write(String data, Writer output) |
写入字符串到Writer |
Writer |
| write(CharSequence data, Writer output) |
写入任意CharSequence到Writer |
Writer |
比较与跳过操作
| 方法 |
作用描述 |
操作对象 |
| contentEquals(InputStream input1, InputStream input2) |
比较两个流内容是否一致 |
InputStream |
| contentEquals(Reader input1, Reader input2) |
比较两个字符流内容是否一致 |
Reader |
| contentEqualsIgnoreEOL(Reader input1, Reader input2) |
忽略换行符进行比较 |
Reader |
| 方法 |
作用描述 |
操作对象 |
| skip(InputStream input, long toSkip) |
跳过指定字节(可能不完全) |
InputStream |
| skip(Reader input, long toSkip) |
跳过指定字符数(可能不完全) |
Reader |
| skipFully(InputStream input, long toSkip) |
强制跳过指定字节,不足则抛异常 |
InputStream |
| skipFully(Reader input, long toSkip) |
强制跳过指定字符数,不足则抛异常 |
Reader |
其他辅助方法
| 方法 |
作用描述 |
操作对象 |
| closeQuietly(Closeable closeable) |
安静关闭Closeable对象(忽略异常) |
Closeable(如InputStream、OutputStream等) |
五、FileUtils(文件/文件夹相关)
以下是 FileUtils 工具类中与文件和目录操作相关的常用方法,按功能分类整理,便于查阅使用。
复制操作
| 方法 |
作用描述 |
操作对象 |
| copyDirectory(File srcDir, File destDir) |
复制整个文件夹及其内容 |
文件夹 |
| copyDirectory(File srcDir, File destDir, FileFilter filter) |
带过滤器复制文件夹 |
文件夹 |
| copyDirectoryToDirectory(File srcDir, File destDir) |
将源文件夹作为子目录复制到目标文件夹 |
文件夹 |
| copyFile(File srcFile, File destFile) |
复制单个文件 |
文件 |
| copyFile(File input, OutputStream output) |
将文件内容复制到输出流 |
文件 → 流 |
| copyFileToDirectory(File srcFile, File destDir) |
将文件复制到指定目录下 |
文件 → 文件夹 |
| copyInputStreamToFile(InputStream source, File destination) |
将输入流写入目标文件 |
流 → 文件 |
| copyURLToFile(URL source, File destination) |
下载URL内容保存为文件 |
URL → 文件 |
| copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout) |
带超时控制的下载 |
URL → 文件 |
字符串写入
| 方法 |
作用描述 |
操作对象 |
| writeStringToFile(File file, String data, String encoding) |
写入字符串到文件 |
文件 |
| writeStringToFile(File file, String data, String encoding, boolean append) |
追加或覆盖写入 |
文件 |
字节数组写入
| 方法 |
作用描述 |
操作对象 |
| writeByteArrayToFile(File file, byte[] data) |
写入字节数组到文件 |
文件 |
| writeByteArrayToFile(File file, byte[] data, boolean append) |
追加写入 |
文件 |
| writeByteArrayToFile(File file, byte[] data, int off, int len) |
指定偏移量写入 |
文件 |
| writeByteArrayToFile(File file, byte[] data, int off, int len, boolean append) |
指定偏移量追加写入 |
文件 |
集合写入(多行文本)
| 方法 |
作用描述 |
参数说明 |
| writeLines(File file, Collection<?> lines) |
写入集合中的每项为一行 |
默认编码、换行符 |
| writeLines(File file, Collection<?> lines, boolean append) |
追加写入多行 |
默认编码、换行符 |
| writeLines(File file, Collection<?> lines, String lineEnding) |
自定义换行符 |
文件 |
| writeLines(File file, Collection<?> lines, String lineEnding, boolean append) |
自定义换行符并追加 |
文件 |
| writeLines(File file, String encoding, Collection<?> lines) |
指定编码写入 |
文件 |
| writeLines(File file, String encoding, Collection<?> lines, boolean append) |
指定编码并追加 |
文件 |
| writeLines(File file, String encoding, Collection<?> lines, String lineEnding) |
指定编码+换行符 |
文件 |
| writeLines(File file, String encoding, Collection<?> lines, String lineEnding, boolean append) |
全部自定义 |
文件 |
通用写入方法
| 方法 |
作用描述 |
操作对象 |
| write(File file, CharSequence data, Charset encoding) |
写入任意字符序列 |
文件 |
| write(File file, CharSequence data, Charset encoding, boolean append) |
追加写入 |
文件 |
| write(File file, CharSequence data, String encoding) |
使用字符串编码写入 |
文件 |
| write(File file, CharSequence data, String encoding, boolean append) |
指定编码并追加写入 |
文件 |
移动/重命名操作
| 方法 |
作用描述 |
操作对象 |
| moveDirectory(File srcDir, File destDir) |
移动整个文件夹及内容 |
文件夹 |
| moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) |
将文件夹作为子目录移动 |
文件夹 |
| moveFile(File srcFile, File destFile) |
移动文件 |
文件 |
| moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) |
将文件移动到指定目录 |
文件 |
| moveToDirectory(File src, File destDir, boolean createDestDir) |
移动文件或目录到指定目录 |
文件/文件夹 |
删除/清空操作
| 方法 |
作用描述 |
操作对象 |
| deleteDirectory(File directory) |
删除整个文件夹(包括内容) |
文件夹 |
| cleanDirectory(File directory) |
清空文件夹内所有内容 |
文件夹 |
| forceDelete(File file) |
强制删除文件或目录(可能抛异常) |
文件/文件夹 |
| deleteQuietly(File file) |
安静删除文件或目录(忽略异常) |
文件/文件夹 |
创建操作
| 方法 |
作用描述 |
操作对象 |
| forceMkdir(File directory) |
创建多级目录 |
文件夹 |
| forceMkdirParent(File file) |
创建文件的父目录 |
文件 |
读取文件内容
| 方法 |
作用描述 |
返回类型 |
| readFileToByteArray(File file) |
读取文件为字节数组 |
byte[] |
| readFileToString(File file, Charset encoding) |
读取文件为字符串 |
String |
| readFileToString(File file, String encoding) |
同上,使用字符串编码 |
String |
| readLines(File file, Charset encoding) |
按行读取为字符串列表 |
List |
| readLines(File file, String encoding) |
同上,使用字符串编码 |
List |
文件迭代
| 方法 |
作用描述 |
操作对象 |
| iterateFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) |
遍历目录下的文件 |
文件夹 |
| iterateFiles(File directory, String[] extensions, boolean recursive) |
按扩展名递归遍历 |
文件夹 |
| iterateFilesAndDirs(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) |
遍历文件和目录 |
文件夹 |
| lineIterator(File file) |
行迭代器读取文件内容 |
文件 |
| lineIterator(File file, String encoding) |
指定编码行读取 |
文件 |
| 方法 |
作用描述 |
返回类型 |
| listFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) |
列出目录下的文件 |
Collection |
| listFiles(File directory, String[] extensions, boolean recursive) |
按扩展名列出文件 |
Collection |
| listFilesAndDirs(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) |
列出文件和目录 |
Collection |
时间比较
| 方法 |
作用描述 |
操作对象 |
| isFileNewer(File file, Date date) |
判断文件是否比某个时间新 |
文件 |
| isFileNewer(File file, File reference) |
比较两个文件修改时间 |
文件 vs 文件 |
| isFileNewer(File file, long timeMillis) |
判断文件是否比某毫秒时间新 |
文件 |
| isFileOlder(File file, Date date) |
判断文件是否比某个时间旧 |
文件 |
| isFileOlder(File file, File reference) |
比较两个文件修改时间 |
文件 vs 文件 |
| isFileOlder(File file, long timeMillis) |
判断文件是否比某毫秒时间旧 |
文件 |
其他实用方法
| 方法 |
作用描述 |
操作对象 |
| isSymlink(File file) |
判断是否是符号链接 |
文件 |
| directoryContains(File directory, File child) |
判断文件夹是否包含某文件/文件夹 |
文件夹 |
| sizeOf(File file) |
获取文件或文件夹大小 |
文件/文件夹 |
| getTempDirectory() / getTempDirectoryPath() |
获取系统临时目录 |
系统路径 |
| getUserDirectory() / getUserDirectoryPath() |
获取用户主目录 |
用户路径 |
| touch(File file) |
创建一个空文件(若不存在) |
文件 |
| contentEquals(File file1, File file2) |
比较两个文件内容是否一致 |
文件 vs 文件 |
推荐:FileUtils 是处理文件和目录结构 的核心工具类。对于流级别 的操作,请使用 IOUtils。两者结合可以高效完成 I/O 和文件系统任务。
六、FilenameUtils(文件名/后缀名相关)
以下是 FilenameUtils 工具类中与文件名、路径、后缀名处理相关的常用方法,按功能分类整理,便于查阅使用。
路径拼接与拆分
| 方法 |
作用描述 |
示例 |
| concat(String basePath, String fullFilenameToAdd) |
拼接基础路径和文件名 |
concat("dir", "file.txt") ➜ "dir/file.txt" |
| getFullPath(String filename) |
获取文件的完整目录部分 |
"dir/file.txt" ➜ "dir/" |
| getName(String filename) |
获取文件名(含扩展名) |
"dir/file.txt" ➜ "file.txt" |
| getPath(String filename) |
去除盘符后的路径部分 |
"C:/dir/file.txt" ➜ "dir" |
| getPrefix(String filename) |
获取盘符或协议前缀 |
"C:/dir/file.txt" ➜ "C:" |
文件名与扩展名操作
| 方法 |
作用描述 |
示例 |
| getBaseName(String filename) |
获取不带扩展名的文件名 |
"file.txt" ➜ "file" |
| getExtension(String filename) |
获取文件扩展名 |
"file.txt" ➜ "txt" |
| removeExtension(String filename) |
移除文件扩展名 |
"file.txt" ➜ "file" |
| indexOfExtension(String filename) |
获取最后一个 . 的位置 |
"file.tar.gz" ➜ 9 |
| indexOfLastSeparator(String filename) |
获取最后一个路径分隔符位置 |
"dir/file.txt" ➜ 3 |
| isExtension(String filename, String extension) |
判断扩展名是否匹配指定值(支持集合、数组) |
"file.txt", "txt" ➜ true |
路径格式转换
| 方法 |
作用描述 |
示例 |
| normalize(String filename) |
标准化路径为当前系统格式 |
"dir\file.txt" ➜ "dir/file.txt" |
| separatorsToSystem(String path) |
转换所有分隔符为当前系统格式 |
"dir/file" ➜ Windows: "dir\file" |
| separatorsToUnix(String path) |
转换为 Unix 风格路径 |
"dir\file" ➜ "dir/file" |
| separatorsToWindows(String path) |
转换为 Windows 风格路径 |
"dir/file" ➜ "dir\file" |
路径比较与判断
| 方法 |
作用描述 |
示例 |
| equals(String filename1, String filename2) |
判断两个路径是否相同(非格式化) |
"dir/file" vs "dir\file" ➜ false |
| equalsNormalized(String filename1, String filename2) |
判断两个路径是否相同(格式化后) |
同上 ➜ true |
| directoryContains(String canonicalParent, String canonicalChild) |
判断父目录是否包含子路径 |
"dir" 包含 "dir/file.txt" ➜ true |
| wildcardMatch(String filename, String wildcardMatcher) |
使用通配符匹配文件名 |
"file.txt" 匹配 "*.txt" ➜ true |
提示:FilenameUtils 是用于字符串形式的路径和文件名操作的工具类,不涉及实际文件系统的读写。适合在进行路径解析、构造、标准化时使用,是构建健壮 I/O 逻辑的重要辅助工具。
除了上文的 IOUtils、FileUtils 和 FilenameUtils 之外,Apache Commons IO 还提供了多个实用且重要的工具类,用于简化 I/O 操作和文件处理。
七、核心工具类详解
FileFilterUtils
提供一系列用于过滤文件的 FileFilter 实现,可用于遍历目录时筛选特定文件。
示例方法:
suffixFileFilter(String suffix):按后缀过滤
prefixFileFilter(String prefix):按前缀过滤
nameFileFilter(String name):按文件名精确匹配
and(FileFilter... filters):组合多个过滤条件
notFileFilter(IOFileFilter filter):取反过滤器
使用示例:
复制代码
File dir = new File ( "path/to/dir" ); File[] txtFiles = dir.listFiles(FileFilterUtils.suffixFileFilter( ".txt" ));
FileSystemUtils
获取文件系统信息,如磁盘使用情况。
示例方法:
freeSpaceKb(String path):获取指定路径所在分区的剩余空间(KB)
freeSpaceKb(String path, int timeout):带超时控制的版本
使用示例:
复制代码
long freeSpace = FileSystemUtils.freeSpaceKb( "C:/" ); // Windows System.out.println( "Free space: " + freeSpace + " KB" );
LineIterator
逐行读取文件内容,支持自动关闭资源。
示例方法:
LineIterator iterator = FileUtils.lineIterator(file, "UTF-8")
while (iterator.hasNext()) { String line = iterator.nextLine(); }
LineIterator.closeQuietly(iterator)
FileDeleteStrategy
定义不同的删除策略,比如延迟删除、强制删除等。
示例方法:
FileDeleteStrategy.NORMAL.delete(file):正常删除
FileDeleteStrategy.FORCE.delete(file):强制删除(忽略只读属性)
EndianUtils
字节顺序转换工具,适用于处理二进制数据(如网络协议、文件格式解析)。
示例方法:
swapShort(short value):大小端转换 Short
swapInt(int value):大小端转换 Int
swapLong(long value):大小端转换 Long
Charsets
提供标准字符集常量,避免手动创建 Charset 对象。
示例常量:
Charsets.UTF_8
Charsets.ISO_8859_1
Charsets.US_ASCII
CopyStream
CopyStreamException / CopyStreamListener / CopyStreamEvent用于在流复制过程中添加监听逻辑(例如显示进度条)。
使用场景:
- 大文件上传/下载时显示进度
- 监控复制过程中的异常或完成状态
八、总结建议
| 场景 |
推荐使用的工具类 |
| 流的复制、读写、关闭 |
IOUtils |
| 文件/目录操作(复制、删除、读写) |
FileUtils |
| 路径拼接、拆分、标准化 |
FilenameUtils |
| 文件过滤(按名称、后缀等) |
FileFilterUtils |
| 获取磁盘空间 |
FileSystemUtils |
| 逐行读取文件 |
LineIterator |
| 自定义删除策略 |
FileDeleteStrategy |
| 字节序转换 |
EndianUtils |
| 字符集常量 |
Charsets |
| 带监听的流复制 |
CopyStreamListener 等相关类 |
开发需要跨平台兼容、高效处理 I/O 的 Java 应用,结合这些工具类一起使用,可以大幅提升开发效率并减少底层 I/O 编程错误。