`

jnotify 监听文件读写

阅读更多
linux环境下需要监听文件事件,jnotify给出java版的解决方案,引用inotify机制。

应对不同事件我们只需要在对应平台下添加对应事件监听即可。


此为监听文件创建、改变、删除、读、写等操作
		public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
			System.out.println("[" + dfFilesNotify.format(new Date()) + "]");
			System.out.println("watch-notify renamed " + rootPath + " : " + oldName + " ---> " + newName);
			if ((rootPath == null) || (newName == null) || newName.endsWith("swp") || newName.endsWith("swx")
					|| newName.endsWith("~") || newName.endsWith("swpx")) {
				return;
			}
			try {
				notifyKafka(rootPath, newName, "FILE_RENAMED");
			} catch (Exception e) {
				System.out.println("call FileParseService failed, " + e);
			}
		}

		public void fileModified(int wd, String rootPath, String name) {
			System.out.println("[" + dfFilesNotify.format(new Date()) + "]");
			System.out.println("watch-notify modified " + rootPath + " : " + name);
			try {
				notifyKafka(rootPath, name, "FILE_NOWRITTEN_CLOSED");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		public void fileDeleted(int wd, String rootPath, String name) {
			System.out.println("[" + dfFilesNotify.format(new Date()) + "]");
			System.out.println("watch-notify deleted " + rootPath + " : " + name);
		}

		public void fileCreated(int wd, String rootPath, String name) {
			System.out.println("[" + dfFilesNotify.format(new Date()) + "]");
			System.out.println("watch-notify created " + rootPath + " : " + name);
		}

		public void fileWrittenClosed(int watchId, String root, String name) {
			System.out.println("[" + dfFilesNotify.format(new Date()) + "]");
			System.out.println("watch-notify-written watchId: " + watchId + "");
			System.out.println("watch-notify-written root: " + root + "");
			System.out.println("watch-notify-written name: " + name + "");

			if ((root == null) || (name == null) || name.endsWith("swp") || name.endsWith("swx") || name.endsWith("~")
					|| name.endsWith("swpx")) {
				return;
			}

			try {
				notifyKafka(root, name, "FILE_WRITTEN_CLOSED");
			} catch (Exception e) {
				System.out.println("call FileParseService failed, " + e);
			}
		}

		public void fileNowrittenClosed(int watchId, String root, String name) {
			File file = new File(root + "/" + name);
			if (file.isDirectory()) {
				return;
			}
			System.out.println("[" + dfFilesNotify.format(new Date()) + "]");
			System.out.println("watch-notify-nowritten watchId: " + watchId + "");
			System.out.println("watch-notify-nowritten root: " + root + "");
			System.out.println("watch-notify-nowritten name: " + name + "");

			if ((root == null) || (name == null) || name.endsWith("swp") || name.endsWith("swx") || name.endsWith("~")
					|| name.endsWith("swpx")) {
				return;
			}

			try {
				notifyKafka(root, name, "FILE_NOWRITTEN_CLOSED");
			} catch (Exception e) {
				System.out.println("call FileParseService failed, " + e);
			}
		}

		private void notifyKafka(String directory, String fileName, String event) throws Exception {
			String propurl = notifyListenersMap.get(directory).get(event) + "";
			File file = new File(propurl);
			if (!file.exists()) {
				return;
			}
			Map<String, String> map = new HashMap<String, String>();
			map.put("fileTime", dfFilesNotify.format(new Date()));
			map.put("fileName", directory + "/" + fileName);
			map.put("fileEvent", event);
			map.put("sftpHostIp", InetAddress.getLocalHost().getHostAddress());
			map.put("sftpHostName", InetAddress.getLocalHost().getHostName());
			ObjectMapper mapper = new ObjectMapper();
			String message = mapper.writeValueAsString(map);

			JDtechProducer producer = JDtechProducer.getInstance(propurl);
			producer.send(1 + "", message);
			System.out.println("watch-notify kafka send : \n" + message + "\n");
			// producer.close();
		}




同时对应适配器中也需要加上相应的事件
		int linuxMask = 0;
		if ((mask & JNotify.FILE_CREATED) != 0) {
			linuxMask |= JNotify_linux.IN_CREATE;
		}
		if ((mask & JNotify.FILE_DELETED) != 0) {
			linuxMask |= JNotify_linux.IN_DELETE;
			linuxMask |= JNotify_linux.IN_DELETE_SELF;
		}
		if ((mask & JNotify.FILE_MODIFIED) != 0) {
			linuxMask |= JNotify_linux.IN_ATTRIB;
			linuxMask |= JNotify_linux.IN_MODIFY;
		}
		if ((mask & JNotify.FILE_RENAMED) != 0) {
			linuxMask |= JNotify_linux.IN_MOVED_FROM;
			linuxMask |= JNotify_linux.IN_MOVED_TO;
		}
		if ((mask & JNotify.FILE_WRITTEN_CLOSED) != 0) {
			linuxMask |= JNotify_linux.IN_CLOSE_WRITE;
		}
		if ((mask & JNotify.FILE_NOWRITTEN_CLOSED) != 0) {
			linuxMask |= JNotify_linux.IN_CLOSE_NOWRITE;
		}







PS:此处改进是否可以将操作的事件发起方记录下来?此为下一步的优化点。
分享到:
评论

相关推荐

    java文件监控例子--jnotify

    在`jnotify`中,你可以注册对单个文件或整个目录的监控,并设置监听的事件类型,如文件创建、删除、修改等。 要开始使用`jnotify`,首先需要在项目中添加`jnotify`的依赖。通常,这可以通过将jar包添加到项目的类...

    APIHook钩子文件监控 监控指定目录下文件的读写和修改.zip

    在本压缩包中,包含的文件主要是C++源代码及相关项目配置文件,用于实现一个APIHook钩子文件监控系统,该系统能够监控指定目录下的文件读写和修改操作。 1. **APIHook原理**: APIHook是通过拦截系统API调用来改变...

    JNotify监控文件夹及文件变化.zip

    JNotify是一个用于文件系统变更通知的Java库,它提供了API来监听文件或目录的创建、删除、修改和重命名事件。本资料包“JNotify监控文件夹及文件变化.zip”包含了一整套实现这个功能的资源。 首先,让我们深入了解...

    开发windows驱动程序,实现监控文件读写操作.zip

    本压缩包"开发windows驱动程序,实现监控文件读写操作.zip"提供了一个关于如何创建驱动程序以监控文件系统读写操作的实例。下面我们将深入探讨这一主题。 1. **驱动程序概述** - 驱动程序是硬件设备与操作系统之间...

    go 实现多文件监听 和 数据读写到指定文件

    在Go语言中,实现多文件监听以及数据读写到指定文件是一个常见的需求,尤其是在系统监控、日志管理和实时数据处理等场景。以下将详细介绍如何利用Go的文件系统接口和并发特性来实现这一功能。 首先,我们需要理解...

    文件读写监控工具文件读写监控工具文件读写监控工具

    文件读写监控工具是计算机系统管理和维护中不可或缺的软件,它们可以帮助用户跟踪、记录和分析系统中的文件操作,包括打开、创建、修改、删除等动作。这类工具在故障排查、性能优化、安全审计等方面有着广泛的应用。...

    Jnotify-0.94源码

    Jnotify是一个轻量级的Java库,用于监听文件系统中的文件和目录的创建、修改和删除事件。这个源码包“Jnotify-0.94”包含了Jnotify库的源代码,相关的配置文件以及编译后的jar包。通过研究这个源码,我们可以深入...

    oracle11g监听文件

    本文将详细介绍Oracle 11g的监听文件及其配置,同时也会提及tnames文件的相关知识。 一、监听文件(listener.ora) 监听文件listener.ora位于Oracle的网络配置目录下,通常是$ORACLE_HOME/network/admin。这个文件...

    Oracle_LISTENER监听文件参数详

    "Oracle LISTENER 监听文件参数详解及 Lsnrctl 命令综述" Oracle LISTENER 监听文件参数详解: LISTENER 监听文件参数是 Oracle Net Listener 的配置文件,用于定义监听器的行为和参数。下面是 LISTENER 监听文件...

    window文件系统索引引擎

    用java写的windows下的文件搜索程序,底层索引存储采用bst(二叉排序树),构造索引时采用深度递归算法(偏慢),只支持对文件的索引,不支持对文件夹的索引,采用jnotify监听文件的新建,修改,删除和重命名,同时自动...

    Android USB检测,文件读写demo

    在Android平台上,USB设备的检测和文件读写是开发者经常遇到的任务,特别是在移动设备与外部存储设备交互的场景中。本教程将详细讲解如何实现"Android USB检测,文件读写demo",帮助你掌握相关技能。 首先,让我们...

    oracle11g监听日志文件过大导致监听无法启动2

    当"Oracle11g监听日志文件过大导致监听无法启动"的问题出现时,通常意味着监听器的日志文件(listener.log)积累了大量的信息,超过了系统设定的限制或者超出可用磁盘空间,从而影响了监听器的正常运行。这个问题...

    js处理文件——文件读写例子.zip

    在JavaScript中,文件读写是Web应用程序中非常重要的功能,特别是在客户端进行数据持久化或交互时。本压缩包"js处理文件——文件读写例子.zip"包含了一个关于JavaScript文件读写操作的实例,这对于理解这一核心概念...

    spring boot文件夹文件监听程序

    总的来说,"spring boot文件夹文件监听程序"是一个结合了Java文件系统监听和Spring Boot自动化功能的实用工具,它可以实时监控指定目录,及时响应文件变化,对于文件管理、数据同步等场景具有很高的价值。...

    易语言源码易语言拦截文件读写源码.rar

    - **钩子设置**:这部分代码会注册一个系统钩子,通常是`SetWindowsHookEx`函数,用于监听文件读写事件。 - **钩子回调**:当文件读写事件发生时,会调用预先设定的回调函数。这里会包含实际的拦截逻辑,比如读取...

    Godot文件的读写,运行后会出现a.txt

    文件读写是通过内置的`File`类实现的,这个类提供了一系列方法来打开、读取、写入和关闭文件。在GDScript中,你可以这样导入`File`类: ```gdscript # 导入File类 var file = File.new() ``` 接着,你需要打开一个...

    Oracle监听文件

    监听所需文件,Oracle使用的监听文件,监听所需文件,Oracle使用的监听文件

    nc文件读写 java版本

    - 在Java中,通常使用Unidata的`ucar`库来处理NetCDF文件,其中`ucar.nc2`包提供了NetCDF文件的读写API。 - `NetcdfFile`类是主要的接口,用于打开和访问NetCDF文件。可以通过`NetcdfFile.open()`方法提供文件路径...

    Android 文件读写操作方法总结

    Android 文件读写操作方法总结 Android 中的文件读写操作是 Android 应用程序开发中不可或缺的一部分。 Android 文件系统中有多种类型的文件,包括资源文件、数据区文件、SD 卡文件等,每种类型的文件都有其特定的...

Global site tag (gtag.js) - Google Analytics