Java 如何监控文件目录的变化
Java如何监控某个目录下文件的变化,如文件增加、删除、修改,也包括子文件夹中的文件,有人建议使用jni,由于要跨平台,最好是纯java的,谢谢。
[解决办法]
http://topic.csdn.net/t/20030708/09/2002243.html
[解决办法]
提供个想法,也不知道算不算是最笨的。
利用File的listFiles() ,lastModified() ,isDirectory() 等方法
0.写个类用于记录目录结构
1.循环遍历需要监视的文件夹,记录下整个目录结构
2.隔个5秒,10秒的,再遍历一遍
3.比较两次取得的目录结构,是否相同
[解决办法]
/** * 递归扫描整个路径 * * @param file * 要扫描的路径 * @param dirFileMap * 存放扫描结果 */ private void totalScan(File file, Map<String, String> dirFileMap) { String[] fileList = file.list(); // 判断是否为空目录 if (null != fileList) { for (int i = 0; i < fileList.length; i++) { String pname = file.getAbsolutePath() + "\\" + fileList[i]; File tempFile = new File(pname); if (tempFile.isDirectory()) { dirFileMap .put("文件夹:" + pname, tempFile.lastModified() + "");//修改了此处 totalScan(tempFile, dirFileMap); } else { // 不相同的文件夹下,存放的文件可能名字相同,但是同一路径下的文件肯定不会相同, // 所以采用全路径做为key值 dirFileMap.put("文件:" + pname, tempFile.lastModified() + "");//修改了此处 } } } } /** * 得到增加的文件及文件夹,并增加到已有的文件信息中 */ private void getAddedFile(Map<String, String> nowDirFileMap) { for (Iterator<String> iterator = nowDirFileMap.keySet().iterator(); iterator .hasNext();) { String key = iterator.next(); String oldValue = oldDirFileMap.get(key); String newValue = nowDirFileMap.get(key); if (null == oldValue) { oldDirFileMap.put(key, newValue); System.out.println("新增的" + key); } } } /** * 得到删除的文件及文件夹,并删除已经不存在的文件信息 */ private void getDeletedFile(Map<String, String> nowDirFileMap) { for (Iterator<String> iterator = oldDirFileMap.keySet().iterator(); iterator .hasNext();) { String key = iterator.next(); String oldValue = oldDirFileMap.get(key); String newValue = nowDirFileMap.get(key); if (null == nowDirFileMap.get(key)) { System.out.println("删除的" + key); iterator.remove(); oldDirFileMap.remove(key); } else if (!newValue.equals(oldValue)) {//修改了此处 System.out.println("修改的" + key); oldDirFileMap.put(key, newValue); } } } /** * 展示原有文件 */ private void displayNowFile() { System.out.println(dir + "路径原有文件目录如下:\n"); Set set = oldDirFileMap.keySet(); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next());//此处修改 } System.out.println("========================"); }
[解决办法]
希望你能用下面方法做:
1,判断是哪类操作系统(win,lin)
2,如果是win用dir命令,如果lin用ls命令扫描指定目录的所有文件的修改时间
3,将所有扫描文件信息保存到文件中去
4,比较刚保存的文件与旧文件的不同就可以得到增加、删除、修改
使用dir命令或者ls命令扫描是非常快的,费时的是比较哦
[解决办法]
java遍历目录的速度是值得怀疑的,特别的网络盘的目录
[解决办法]
好长的代码。不如用Jython了,反正也可移植。代码短多了。不说别的,就是os.path.walk就解决了递归子目录的问题。
[解决办法]
用dir /s 目录,
例如: dir /s c:\
这个命令是遍历C盘下所有文件夹和子文件夹,文件及子文件。
[解决办法]
不错
[解决办法]
朋友可以试试看 commons-jci, 通过看它的api好像提供了相关的监听器,不过我没有仔细研究过。
http://commons.apache.org/jci/commons-jci-fam/index.html
[解决办法]
可以参考Jboss等应用服务器的热部署、Jakarta-Common-Configuration
[解决办法]
操作系统都带有一个底层库,该底层库提供一个接口,可以捕获文件变动的事件,并发出通知。
可以通过这种方式来实现,以前的时候做过这种东西,不过代码已经都没有了,你可以网上查一下应该有相关的资料。
基本的方式只有两种一种是轮询;另外一种就是基于事件;
轮询效率是个问题,另外实时性也不高。基于事件的的坏处就是不同的操作系统提供的接口不一致你需要针对不同的操作平台进行开发。
[解决办法]
先用vc写一个java调用的dll
内容:
HANDLE dwChangeHandles[2];
dwChangeHandles[0] = FindFirstChangeNotification(
"C:\\WINDOWS", // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
dwChangeHandles[1] = FindFirstChangeNotification(
"C:\\", // directory to watch
TRUE, // watch the subtree
FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir. name changes
dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles,
FALSE, INFINITE);
有文件修改就触发事件了。linux也应该有相应方法
[解决办法]
学习啊,,,,
[解决办法]
新手上路;多多关照!
个人思路:
记得有种叫面向切面的编程思想!需要用到动态代理.log4j好像就用到它了!
如果自己写增删改查可以参考下!
如果不是自己写的,那我没有办法!
学习中....