`
kawaii_xw
  • 浏览: 47318 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

多线程监听文件改动

阅读更多

一种比较简陋的方法:

<!----> 1 ActionListener taskPerformer = new ActionListener() {
2 public void actionPerformed(ActionEvent evt) {
3 log.info( " monitor is running at " + new java.util.Date());
4 String configfile = (String)getServletContext().getAttribute( " configfile " );
5 if (configfile != null && configfile.length() != 0 ){
6 try {
7 File file = new File(configfile);
8 if (file.lastModified() > lastModifyTime){
9 lastModifyTime = file.lastModified();
10 loadProp();
11 }
12 } catch (Exception e){
13 log.error( " construct file: " + configfile + " exception " );
14 e.printStackTrace();
15 }
16 }
17 }
18 };
19
20 // 启动监听线程
21 new Timer(delay, taskPerformer).start();



来自geosoft.no的解决方法:

<!----> 1 import java.io.File;
2
3 /**
4 * Interface for listening to disk file changes.
5 * @see FileMonitor
6 *
7 * @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a>
8 */
9 public interface FileListener
10 {
11 /**
12 * Called when one of the monitored files are created, deleted
13 * or modified.
14 *
15 * @param file File which has been changed.
16 */
17 void fileChanged (File file);
18 }

 

<!----> 1 import java.util. * ;
2 import java.io.File;
3 import java.lang.ref.WeakReference;
4
5 /**
6 * Class for monitoring changes in disk files.
7 * Usage:
8 *
9 * 1. Implement the FileListener interface.
10 * 2. Create a FileMonitor instance.
11 * 3. Add the file(s)/directory(ies) to listen for.
12 *
13 * fileChanged() will be called when a monitored file is created,
14 * deleted or its modified time changes.
15 *
16 * @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a>
17 */
18 public class FileMonitor
19 {
20 private Timer timer_;
21 private HashMap files_; // File -> Long
22 private Collection listeners_; // of WeakReference(FileListener)
23
24
25 /**
26 * Create a file monitor instance with specified polling interval.
27 *
28 * @param pollingInterval Polling interval in milli seconds.
29 */
30 public FileMonitor ( long pollingInterval)
31 {
32 files_ = new HashMap();
33 listeners_ = new ArrayList();
34
35 timer_ = new Timer ( true );
36 timer_.schedule ( new FileMonitorNotifier(), 0 , pollingInterval);
37 }
38
39
40
41 /**
42 * Stop the file monitor polling.
43 */
44 public void stop()
45 {
46 timer_.cancel();
47 }
48
49
50 /**
51 * Add file to listen for. File may be any java.io.File (including a
52 * directory) and may well be a non-existing file in the case where the
53 * creating of the file is to be trepped.
54 * <p>
55 * More than one file can be listened for. When the specified file is
56 * created, modified or deleted, listeners are notified.
57 *
58 * @param file File to listen for.
59 */
60 public void addFile (File file)
61 {
62 if ( ! files_.containsKey (file)) {
63 long modifiedTime = file.exists() ? file.lastModified() : - 1 ;
64 files_.put (file, new Long (modifiedTime));
65 }
66 }
67
68
69
70 /**
71 * Remove specified file for listening.
72 *
73 * @param file File to remove.
74 */
75 public void removeFile (File file)
76 {
77 files_.remove (file);
78 }
79
80
81
82 /**
83 * Add listener to this file monitor.
84 *
85 * @param fileListener Listener to add.
86 */
87 public void addListener (FileListener fileListener)
88 {
89 // Don't add if its already there
90 for (Iterator i = listeners_.iterator(); i.hasNext(); ) {
91 WeakReference reference = (WeakReference) i.next();
92 FileListener listener = (FileListener) reference.get();
93 if (listener == fileListener)
94 return ;
95 }
96
97 // Use WeakReference to avoid memory leak if this becomes the
98 // sole reference to the object.
99 listeners_.add ( new WeakReference (fileListener));
100 }
101
102
103
104 /**
105 * Remove listener from this file monitor.
106 *
107 * @param fileListener Listener to remove.
108 */
109 public void removeListener (FileListener fileListener)
110 {
111 for (Iterator i = listeners_.iterator(); i.hasNext(); ) {
112 WeakReference reference = (WeakReference) i.next();
113 FileListener listener = (FileListener) reference.get();
114 if (listener == fileListener) {
115 i.remove();
116 break ;
117 }
118 }
119 }
120
121
122
123 /**
124 * This is the timer thread which is executed every n milliseconds
125 * according to the setting of the file monitor. It investigates the
126 * file in question and notify listeners if changed.
127 */
128 private class FileMonitorNotifier extends TimerTask
129 {
130 public void run()
131 {
132 // Loop over the registered files and see which have changed.
133 // Use a copy of the list in case listener wants to alter the
134 // list within its fileChanged method.
135 Collection files = new ArrayList (files_.keySet());
136
137 for (Iterator i = files.iterator(); i.hasNext(); ) {
138 File file = (File) i.next();
139 long lastModifiedTime = ((Long) files_.get (file)).longValue();
140 long newModifiedTime = file.exists() ? file.lastModified() : - 1 ;
141
142 // Chek if file has changed
143 if (newModifiedTime != lastModifiedTime) {
144
145 // Register new modified time
146 files_.put (file, new Long (newModifiedTime));
147
148 // Notify listeners
149 for (Iterator j = listeners_.iterator(); j.hasNext(); ) {
150 WeakReference reference = (WeakReference) j.next();
151 FileListener listener = (FileListener) reference.get();
152
153 // Remove from list if the back-end object has been GC'd
154 if (listener == null )
155 j.remove();
156 else
157 listener.fileChanged (file);
158 }
159 }
160 }
161 }
162 }
163
164
165 /**
166 * Test this class.
167 *
168 * @param args Not used.
169 */
170 public static void main (String args[])
171 {
172 // Create the monitor
173 FileMonitor monitor = new FileMonitor ( 1000 );
174
175 // Add some files to listen for
176 monitor.addFile ( new File ( " D:\\myjava\\JCreatorWorkspace\\FileMonitor\\test.txt " ));
177
178 // Add a dummy listener
179 monitor.addListener (monitor. new TestListener());
180
181 // Avoid program exit
182 while ( ! false ) ;
183 }
184
185
186 private class TestListener
187 implements FileListener
188 {
189 public void fileChanged (File file)
190 {
191 System.out.println ( " File [ " + file.getName() + " ] changed At: " + new java.util.Date());
192 }
193 }
194 }
195
196
197

 

分享到:
评论

相关推荐

    监听文件下文件发生变化时复制文件到另一个文件夹

    本案例的标题和描述提到了“监听文件下文件发生变化时复制文件到另一个文件夹”,这通常涉及到文件系统的观察者模式(Observer Pattern)和多线程技术。 首先,我们需要理解“监听文件”这一概念。在操作系统层面,...

    使用线程 目录监视 文件改动

    当我们谈论“使用线程 目录监视 文件改动”时,我们实际上是在讨论如何利用多线程技术来实时监控文件或目录的变化,并对这些变化做出响应。 目录监视是一种功能,允许程序跟踪指定目录中的文件或子目录的添加、删除...

    监听文件是否改变

    5、程序开始监视该目录本身以及该目录下所有子目录和文件,若有任何变动(包括文件/文件夹重命名、移动、复制、删除、修改、新建等),则在屏幕打印“目录被改动![时间:(输出变动时间)]” 6、监视过程中,若用户...

    delphi 监视文件夹改动

    5. **多线程**: 由于文件系统监控通常涉及I/O操作,可能会阻塞主线程,因此可能需要在后台线程中运行监控任务,以保持应用程序的响应性。 6. **错误处理**: 实现文件夹监控时,必须考虑错误处理,例如文件夹不...

    Python写一个基于MD5的文件监听程序

    在Python编程中,有时我们需要监控文件系统的变动,例如...结合配置文件,我们可以灵活地设置监听规则,实现对多个文件夹的定制化监控。这个程序对于日志监控、数据备份或其他需要实时跟踪文件改动的场景都十分有用。

    Java进程配置文件Reload

    6. **线程安全**:在多线程环境中,配置文件的重新加载需要确保线程安全。通常,配置对象会被多个线程共享,因此更新配置时应采取同步机制,避免数据竞争。 7. **事件驱动编程**:可以采用事件驱动的方式处理配置...

    FileMointorUploadTool:用于监视文件改动,并通过列队的形式上传到网站

    主要功能 实时监听指定目录的变化情况 将文件变动变化情况记录,过滤掉无用的信息(通过文件...多线程运行 7牛存储API的使用 模拟post登录,并模拟向web后台添加内容 利用文件md5值做为文件指纹,去掉重复文件 记录博客

    文件修改监视系统[VB.net源代码]

    8. **多线程**:考虑到文件系统事件可能频繁触发,为了不影响主应用程序的响应性,可以使用多线程技术。例如,将事件处理逻辑放在后台线程上执行,避免阻塞UI。 9. **调试与测试**:在开发过程中,使用Visual ...

    Node.js-监控文件改变然后scp到服务器

    可以采用增量同步、批量处理和多线程等策略来提高效率。 10. **日志记录**: 记录监控和同步过程中的事件和错误对于调试和监控系统状态至关重要。使用如`winston`这样的日志库可以帮助我们轻松地管理和分析日志信息...

    动态加载properties

    - 确保在多线程环境中安全地访问和更新配置,可能需要同步控制。 - 如果配置文件过大,频繁加载可能会对性能造成影响,考虑使用缓存和合理的加载策略。 - 捕获并处理可能出现的异常,如文件不存在、读取失败等。 ...

    Java制作小游戏:推箱子

    该项目主要使用了多线程、JFrame框架窗体、Panel面板、IO流、KeyListener键盘监听器以及音频播放等技术实现的。 Java基础入门,使用Java语言制作简单的小游戏,项目中添加了注释,方便读者阅读理解。同学可以通过对...

    易语言监视文件夹是否被改动.zip

    总的来说,“易语言监视文件夹是否被改动.zip”中的源码为我们展示了如何利用易语言这一国产编程语言来实现文件系统监控,这对于系统管理、数据备份、日志记录等领域都有重要的应用价值。通过学习和研究这段代码,...

    论文研究-视频转发系统的实现及其应用 .pdf

    其主要特点包括使用C++语言开发,支持多线程架构,并以守护进程的方式运行。服务器启动时,会加载streamingserver.xml文件中的默认参数,进行资源和信号处理方法的配置,并启动三个主要的工作线程:空闲线程、事件...

    MFC下的监视目录

    总之,MFC下的目录监视功能是通过结合Windows API和MFC的类库实现的,它涉及到线程处理、异步操作、文件系统事件处理等多个方面,是提升应用程序功能和用户体验的重要技术。在实际开发中,这种功能可以应用于各种...

    ZDNS DHCP架构分析和优化建议(2018-4-11).pdf

    为了解决 ISC DHCP 的缺陷,我们可以采用高性能 DHCP 架构和处理方案,如 ZDNS DHCP 多进程方案和 ZDNS DHCP 多线程方案。 ZDNS DHCP 多进程方案 ZDNS DHCP 多进程方案可以实现高性能的 DHCP 服务器。该方案的优点...

    Go-一个Go包努力效仿BSDtail程序的功能

    6. **多线程/协程**:为了实现文件监控和用户交互并行,Go包可能会使用Go的并发特性,如goroutines和channels。一个goroutine负责监控文件,另一个处理用户输入和输出。 7. **日志记录与调试**:在开发过程中,可能...

    FileTransfer:局域网文件传输 LAN FileTransfer

    1.0版本 1.点击开始传输后 保留“传输文件”字样 2.尝试改动buff[]的大小能否加快传输速度 3.将接收界面的文件名限定长度 4.activity_main中,...5.新增多线程传输一个文件的功能 6.显示下载速度 7.改用多端口监听

    修改ibatis不用重启的方法

    5. **使用IDE集成功能**:很多IDE(如IntelliJ IDEA,Eclipse)都有热部署插件,如JRebel或Spring Loaded,它们能够在代码修改后自动重新加载类,包括iBatis的配置和mapper文件。 6. **避免缓存**:确保在mapper...

    Qt+Mysql的学生信息管理与收发系统

    使用技术:C/S(客户端-服务器)、TCP/IP(协议)、socket、多线程、数据库; 4.项目描述:1)服务器:服务器监听一个IP地址,用来连接教师端和学生端,用于数据转发(eg:教师端发消息到服务器,在由服务器发消息到学生...

    apache_2.2.4.mis + mod_jk-apache-2.2.4.so集群配置必备软件

    在这个文件中,你可以定义服务器监听的端口、虚拟主机、日志文件位置等信息。为了整合mod_jk,你需要在httpd.conf中加载mod_jk模块并配置相关指令。 3. **mod_jk.conf**:这是mod_jk模块的特定配置文件,包含了mod_...

Global site tag (gtag.js) - Google Analytics