需求:
爬虫每小时会抓取文件进入某文件夹
##监控新文件的进入—————-这是主要部分,我们需要的是实时监控
如果有新文件,则对文件进行处理
解决方案:使用JNotify
JNotify:文件系统事件的java库
JNotify介绍
JNotify是让应用程序监听文件系统事件的Java库,可以监听的事件例如:
- 创建文件事件
- 修改文件事件
- 文件重命名事件
- 删除文件事件
支持操作系统:
1.Windows
2.Linux
3.Max OS
JNotify使用
下载链接: http://jnotify.sourceforge.net/index.html官网地址
解压后目录:
测试使用
1.导入相关包
1.1 导入jar包
1.2 将jnotify_64bit.dll,jnotify.dll放入jre\bin目录中;我的jre目录是D:\Program Files\Java\jre-10.0.1\bin
简单实例
实现对文件目录的监听
import java.io.File;
import net.contentobjects.jnotify.JNotify;
public class FileNotify {
public static void notify(String filepath) throws Exception {
if (!new File(filepath).exists()) {
System.out.println("文件目录不存在");
return;
}
// 定义你所需要检测的事件类型,或者是全部FILE_ANY
int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
int mask1 =JNotify.FILE_ANY;
System.out.println(JNotify.FILE_CREATED);//1
System.out.println(JNotify.FILE_DELETED);//2
System.out.println( JNotify.FILE_MODIFIED);//4
System.out.println( JNotify.FILE_RENAMED);//8
System.out.println(mask);//15
System.out.println(mask1);//15
// 是否检测子目录
boolean watchSubtree = true;
// 添加监听
int watchID = JNotify.addWatch(filepath, mask, watchSubtree, new Listener());
System.out.println(watchID);
// 定义监听持续时间,此处是死循环,所以是时刻监听
// while(true) {
// Thread.sleep(1000*60);
// }
// 定义监听时间,如果超过这个时间,程序会退出;如果不定义就得不到监听
Thread.sleep(1000*60);//60秒
//移除监听
boolean res = JNotify.removeWatch(watchID);
if (!res) {
// invalid watch ID specified.
}
}
public static void main(String[] args) {
String path ="F:\\Pm25";
System.out.println(path);
try {
notify(path);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
相关监听事件的处理
import net.contentobjects.jnotify.JNotifyListener;
class Listener implements JNotifyListener {
public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
System.out.println(wd);
System.out.println(rootPath);
print("renamed " + rootPath + " : " + oldName + " -> " + newName);
}
public void fileModified(int wd, String rootPath, String name) {
print("modified " + rootPath + " : " + name);
}
public void fileDeleted(int wd, String rootPath, String name) {
print("deleted " + rootPath + " : " + name);
}
public void fileCreated(int wd, String rootPath, String name) {
print("created " + rootPath + " : " + name);
}
void print(String msg) {
System.err.println(msg);
}
}
相关错误
如果出现如下错误,是因为缺少dll库
Error loading library, java.library.path=D:\Program Files\Java\jre-10.0.1\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;.
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jnotify_64bit in java.library.path: [D:\Program Files\Java\jre-10.0.1\bin, C:\windows\Sun\Java\bin, C:\windows\system32, C:\windows, C:\Program Files (x86)\Common Files\Oracle\Java\javapath, C:\windows\system32, C:\windows, C:\windows\System32\Wbem, C:\windows\System32\WindowsPowerShell\v1.0\, C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps, ., .]
at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.base/java.lang.Runtime.loadLibrary0(Unknown Source)
at java.base/java.lang.System.loadLibrary(Unknown Source)
at net.contentobjects.jnotify.win32.JNotify_win32.<clinit>(Unknown Source)
at net.contentobjects.jnotify.win32.JNotifyAdapterWin32.<init>(Unknown Source)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.base/java.lang.Class.newInstance(Unknown Source)
at net.contentobjects.jnotify.JNotify.<clinit>(Unknown Source)
at FileNotify.notify(FileNotify.java:26)
at FileNotify.main(FileNotify.java:49)
解决:
1.将jnotify_64bit.dll,jnotify.dll放入jre\bin目录
友情提示:
Java有两个Path,一个是classpath,另外一个library.path。
classpath是设置JDK的lib位置.
而library.path是设置引用的非Java类包(如DLL,SO)的位置。
此类问题设置参见: 百度链接