1.介绍
Apache Commons 项目旨在为开发人员提供一组可以在日常代码中使用的公共库。
本篇文章中将了解 Commons IO 模块的一些关键实用程序类及功能。
2.Maven依赖
要使用该库,需要在 pom.xml 中包含以下 Maven 依赖项:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
3.实用程序类
实用程序类提供了一组静态方法,可用于在文件上执行常见任务。
3.1. FileUtils
该类提供对文件的不同操作,如打开、读取、复制和移动。
下面示例演示如何使用 FileUtils 读取或复制文件:
@Test
public void test1() throws IOException {
//获取类路径下文件
File file = FileUtils.getFile(getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath());
//获取临时文件夹
File tempDir = FileUtils.getTempDirectory();
//复制文件到临时文件夹下
FileUtils.copyFileToDirectory(file, tempDir);
//获取临时文件夹下文件
File newTempFile = FileUtils.getFile(tempDir, file.getName());
String data = FileUtils.readFileToString(newTempFile,
Charset.defaultCharset());
System.out.println(data);
}
3.2. FilenameUtils
此实用程序提供了一种与操作系统无关的方式来对文件名执行常见功能。
@Test
public void test2(){
String path="D:\\test.txt";
//从完整文件名中获取完整路径,即前缀 + 路径。
String fullPath = FilenameUtils.getFullPath(path);
System.out.println("fullPath:"+fullPath);
//获取文件后缀
String extension = FilenameUtils.getExtension(path);
System.out.println("extension:"+extension);
//获取文件名 不包含后退
String baseName = FilenameUtils.getBaseName(path);
System.out.println("baseName:"+baseName);
}
3.3.FileSystemUtils
可以使用 FileSystemUtils 检查给定卷或驱动器上的可用空间:
Runtime.getRuntime().exec()类执行 关于操作系统的命令,详情可查看源码
4.输入和输出
这个包提供了几种处理输入和输出流的实现。
重点介绍 TeeInputStream 和 TeeOutputSteam。 “Tee”一词(源自字母“T”)通常用于描述将单个输入拆分为两个不同的输出。
以下示例演示如何将单个输入流写入两个不同的输出流:
@Test
public void test4() throws IOException {
String str = "Hello World.";
ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());
ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream();
ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream();
FilterOutputStream teeOutputStream = new TeeOutputStream(outputStream1, outputStream2);
new TeeInputStream(inputStream, teeOutputStream, true).read(new byte[str.length()]);
System.out.println(outputStream1);//Hello World.
System.out.println(outputStream2);//Hello World.
}
5. Filters
Commons IO 包括一个有用的文件过滤器列表。 当想要从异构文件列表中缩小到特定的所需文件列表时,这些可以派上用场。
该库还支持对给定文件列表的 AND 和 OR 逻辑运算。 因此,可以混合和匹配这些过滤器以获得所需的结果。
以下示例演示如何使用 WildcardFileFilter 和 SuffixFileFilter 来检索名称中包含“ple”并带有“txt”后缀的文件。 请注意,使用 ANDFileFilter 包装了上面的过滤器:
@Test
public void test5() {
String path = getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath();
//获取文件夹
File dir = FileUtils.getFile(FilenameUtils.getFullPath(path));
String[] txts = dir.list(new AndFileFilter(
new WildcardFileFilter("*ple*", IOCase.INSENSITIVE),
new SuffixFileFilter("txt")));
assert txts != null;
String collect = String.join(",", txts);
System.out.println(collect);
}
输出:
aaapleaaa.txt,sample.txt
6. Comparators
Comparator 包提供了不同类型的文件比较。
6.1. PathFileComparator
PathFileComparator 类可用于按文件的路径以区分大小写、不区分大小写或依赖于系统的区分大小写的方式对文件列表或数组进行排序。
来看看如何使用此实用程序对资源目录中的文件路径进行排序:
@Test
public void test6() {
PathFileComparator pathFileComparator = new PathFileComparator(
IOCase.INSENSITIVE);
String path = FilenameUtils.getFullPath(getClass()
.getClassLoader()
.getResource("fileTest.txt")
.getPath());
File dir = new File(path);
File[] files = dir.listFiles();
pathFileComparator.sort(files);
for (File file : files) {
System.out.println(file.getName());
}
}
请注意,这里使用了 IOCas.INSENSITIVE 配置。 PathFileComparator 还提供了许多具有不同大小写敏感度和反向排序选项的单例实例。
这些静态字段包括 PATH_COMPARATOR、PATH_INSENSITIVE_COMPARATOR、PATH_INSENSITIVE_REVERSE、PATH_SYSTEM_COMPARATOR 等。
6.2. SizeFileComparator
SizeFileComparator,用于比较两个文件的大小(长度)。 如果第一个文件的大小小于第二个文件的大小,则返回一个负整数值。 如果文件大小相等,则返回零,如果第一个文件的大小大于第二个文件的大小,则返回正值。
具体示列如下:
@Test
public void test7() {
SizeFileComparator sizeFileComparator = new SizeFileComparator();
File largerFile = FileUtils.getFile(getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath());
File smallerFile = FileUtils.getFile(getClass().getClassLoader()
.getResource("sample.txt")
.getPath());
int i = sizeFileComparator.compare(largerFile, smallerFile);
System.out.println(i);
}
7.文件监视器
Commons IO 监视器包提供跟踪文件或目录更改的功能。演示示例,说明如何将 FileAlterationMonitor 与 FileAlterationObserver 和 FileAlterationListener 一起使用来监视文件或文件夹。
当 FileAlterationMonitor 启动时,将开始接收有关正在监视的目录上的文件更改的通知:
public class FileMonitor {
public static void main(String[] args) throws Exception {
//File folder = FileUtils.getTempDirectory();
File folder = new File("D:\\");
startFileMonitor(folder);
}
public static void startFileMonitor(File folder) throws Exception {
FileAlterationObserver observer = new FileAlterationObserver(folder);
FileAlterationMonitor monitor = new FileAlterationMonitor(5000);
//FileAlterationListenerAdaptor 提供了很多方法
FileAlterationListener fal = new FileAlterationListenerAdaptor() {
@Override
public void onFileCreate(File file) {
// on create action
System.out.println("create file name:" + file.getName());
}
@Override
public void onFileDelete(File file) {
// on delete action
System.out.println("delete file name:" + file.getName());
}
};
observer.addListener(fal);
monitor.addObserver(observer);
monitor.start();
}
}