java实现监听目录下所有文件和文件夹下的文件
有个面试题,大概讲的是监听目录下所有文件包括文件夹下的文件夹下的文件,递归,
主要使用了common-io包,maven依赖如下:
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
java测试代码如下,使用main方法执行即可:
filefilter具体类的作用参见:https://blog.csdn.net/qq_38366063/article/details/89263325
public static void questionTwo() {
// 监控目录
String rootDir = "E:\\test\\A\\";
// 轮询间隔 3 秒
long interval = TimeUnit.SECONDS.toMillis(3);
//遍历根目录下所有文件
Collection<File> listFiles = FileUtils.listFiles(new File(rootDir),
FileFilterUtils.suffixFileFilter(".jpg"), DirectoryFileFilter.DIRECTORY);
for (File file : listFiles) {
System.out.println(file.getName());
}
//不使用过滤器,就会监听目录下所有文件,目录(包括子文件里面的改动)
// FileAlterationObserver observer = new FileAlterationObserver(
// new File(rootDir));
//rootDir,选定路径,只会监听当前路径下的文件以.jpg结尾的文件,不包括子目录下文件
FileAlterationObserver observer = new FileAlterationObserver(
rootDir,
FileFilterUtils.and(
FileFilterUtils.fileFileFilter(),
FileFilterUtils.suffixFileFilter(".jpg")));
observer.addListener(new MyFileListener());
FileAlterationMonitor monitor = new FileAlterationMonitor(interval,observer);
// 开始监控
try {
monitor.start();
} catch (Exception e) {
e.printStackTrace();
}
}
MyFileListener监听类,我这里是监听到A文件夹如果增加了文件,就会复制到B文件夹:
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.*;
/**
* 自定义文件监听器
*/
public class MyFileListener extends FileAlterationListenerAdaptor {
public static final String rootDir = "E:\\test\\B\\";
@Override
public void onFileCreate(File file) {
System.out.println("[新建]:" + file.getAbsolutePath());
String absolutePath = file.getParent();
String[] split = absolutePath.split("\\\\");
int length = split.length;
try {
File file1 = new File(rootDir + split[length - 3] + "_" + split[length - 2] + "_" + split[length - 1] + "_" + file.getName().substring(file.getName().lastIndexOf('.')));
FileUtils.copyFile(file, file1);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFileChange(File file) {
System.out.println("[修改]:" + file.getAbsolutePath());
}
@Override
public void onFileDelete(File file) {
System.out.println("[删除]:" + file.getAbsolutePath());
}
@Override
public void onDirectoryCreate(File directory) {
System.out.println("[目录创建]:" + directory.getAbsolutePath());
super.onDirectoryCreate(directory);
}
@Override
public void onStart(FileAlterationObserver observer) {
System.out.println("[开始监听]");
super.onStart(observer);
}
@Override
public void onStop(FileAlterationObserver observer) {
System.out.println("[停止监听]");
super.onStop(observer);
}
@Override
public void onDirectoryDelete(File directory) {
System.out.println("[目录删除]:" + directory.getAbsolutePath());
super.onDirectoryDelete(directory);
}
@Override
public void onDirectoryChange(File directory) {
System.out.println("[目录修改]:" + directory.getAbsolutePath());
super.onDirectoryChange(directory);
}
// 复制文件
public static void copyFile(File sourceFile, File targetFile)
throws IOException {
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
try {
inBuff = new BufferedInputStream(new FileInputStream(sourceFile));
outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
outBuff.flush();
} finally {
if (inBuff != null)
inBuff.close();
if (outBuff != null)
outBuff.close();
}
}
}
世界上所有的不公平都是由于当事人能力不足造成的.