前言
最近在开发制药lims的数据采集程序,因为一些硬件设备,没有和lims直连的方式,而且将数据存放到了数据库中,也不知道数据库的账号密码,只能拿到他们的备份文件或者在软件内导出excel,pdf,xml,txt等一些文件,所以想到的办法就是,让操作员将文件导出到一个指定的目录,数采程序通过监听这个目录,来判断是否是新添加的文件。
准备工作
环境
Maven 3.6.3
SpringBoot
现成的轮子
commons-io
ApacheCommons IO库包含实用程序类、流实现、文件过滤器、文件比较器、endian转换类等。
POM依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
开发
用到的类
FileAlterationObserver 创建一个目录监控
FileAlterationListenerAdaptor 监听器,用来监听文件是否被操作以及,获取操作的文件
FileFilterUtils 过滤器的工具类
IOFileFilter 过滤器接口
文件过滤器和监控目录
点进去 FileAlterationObserver ,看到一个参数为 目录名称和文件过滤的构造器
public FileAlterationObserver(String directoryName, FileFilter fileFilter) {
this(new File(directoryName), fileFilter);
}
通过FileFilter名字可以知道,这个就是过滤文件后缀的,所以我们先创建一个 FileFitler
创建 文件过滤
// .txt,csv
this._type = ".txt";
IOFileFilter fileFilter = FileFilterUtils.and(
FileFilterUtils.fileFileFilter(),
FileFilterUtils.suffixFileFilter(this._type));
创建目录监控
FileAlterationObserver _ob = new FileAlterationObserver(this.path,fileFilter);
添加监听器
实现 FileAlterationListenerAdaptor类,然后会继承一些方法,然后使用FileAlterationObserver的addlistener方法添加进去这个就好
如下代码:
_ob.addListener(new FileAlterationListenerAdaptor(){
@Override
public void onStart(FileAlterationObserver observer) {
log.debug("{} 已开启监控文件夹:{}",_name,path);
}
@Override
public void onDirectoryCreate(File directory) {
logger.info("有新文件夹生成:{}",directory.getName());
}
@Override
public void onDirectoryChange(File directory) {
logger.info("有文件夹内容发生变化:{}",directory.getName());
}
@Override
public void onDirectoryDelete(File directory) {
logger.info("有文件夹被删除:{}",directory.getName());
}
@Override
public void onFileCreate(File file){
logger.info("有新增文件:{}",file.getName());
}
@Override
public void onFileChange(File file){
logger.info("有文件被修改:{}",file.getName());
}
@Override
public void onFileDelete(File file){
logger.info("有文件被删除:{}",file.getName());
}
@Override
public void onStop(FileAlterationObserver observer){
log.debug("{}:已停止监控文件夹:{}",_name,path);
}
});
启动监听
工具的默认监听时间是1秒,也就是1000ms,在FileAlterationMonitor创建的时候,可以设置监听时间
// 构造器
// long interval 就是监听时间参数
public FileAlterationMonitor() {
this(10000L);
}
public FileAlterationMonitor(long interval, FileAlterationObserver... observers) {
this(interval);
if (observers != null) {
FileAlterationObserver[] arr$ = observers;
int len$ = observers.length;
for(int i$ = 0; i$ < len$; ++i$) {
FileAlterationObserver observer = arr$[i$];
this.addObserver(observer);
}
}
// 如果想每次监听到的时间变长点,就把interval改成其他时间就行,单位是毫秒
FileAlterationMonitor _monitor = new FileAlterationMonitor(1000, _ob);
// 启动
_monitor.start();
结尾
没有结尾。。。