`
kawaii_xw
  • 浏览: 46650 次
  • 性别: 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

 

分享到:
评论

相关推荐

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

    建立线程用于目录监视, 文件改动.

    监听文件是否改变

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

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

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

    Java制作小游戏:推箱子

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

    FileTransfer:局域网文件传输 LAN FileTransfer

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

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

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

    Visual C++程序开发范例宝典(光盘) 第四部分

    实例190 多线程 实例 6.8 鼠标、键盘相关设置 实例191 动画鼠标 实例192 限制鼠标移动区域 第7章 注册表 7.1 显示与隐藏 实例193 隐藏、显示“我的电脑”、“回收站”、“网上邻居” 实例194 隐藏、显示...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例190 多线程 实例 6.8 鼠标、键盘相关设置 实例191 动画鼠标 实例192 限制鼠标移动区域 第7章 注册表 7.1 显示与隐藏 实例193 隐藏、显示“我的电脑”、“回收站”、“网上邻居” 实例194 隐藏、显示...

    Windows 系统错误代码简单分析

    调用者需要列举所有文件以找到改动的内容。  1051 已将停止控制发送给与其他运行服务相关的服务。  1052 所要求的控制对此服务无效。  1053 服务没有及时地响应启动或控制请求。  1054 无法为该服务创建...

    Visual C++ 程序开发范例宝典 源码 光盘 part2

    cc实例 190 多线程cc实例 6.8 鼠标.c键盘相关设置 cc实例191 动画鼠标 cc实例192 限制鼠标移动区域 第7章 注册表 7.1 显示与隐藏 cc 实例193 隐藏.c显示“我的电脑”.c“回收站”.c“网上邻居” cc...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     cc实例190 多线程cc实例   6.8 鼠标.c键盘相关设置   cc实例191 动画鼠标   cc实例192 限制鼠标移动区域  第7章 注册表   7.1 显示与隐藏  cc 实例193 隐藏.c显示“我的电脑”.c“回收站”.c...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     cc实例190 多线程cc实例   6.8 鼠标.c键盘相关设置   cc实例191 动画鼠标   cc实例192 限制鼠标移动区域  第7章 注册表   7.1 显示与隐藏  cc 实例193 隐藏.c显示“我的电脑”.c“回收站”.c...

    st_asio_wrapper——一组包装boost.asio的c/s框架(2.2版)

    增加了一个demo——文件传输服务端及客户端,它几乎可以当成软件来使用,多线程且支持分块传送; 增加了timer功能,考虑到st_server已经用上了timer,加之做文件传输服务器的时候,也用到了timer,所以干脆把timer...

    Gh0st RAT Beta 3.6 C++源码

    可安装多个服务端 其它细节方面的功能大家自己去发现吧 功能: &lt;br&gt;文件管理 完全仿Radmin所写, 文件、文件夹批量上传、删除、下载、创建、重命名 屏幕监视 扫描算法速度最快可达到120帧/秒,差异算法...

    iscsi协议及实现

    当在4002端口监听的线程接收请求后 创建线程iscsi_rx_thread接收SCSI命令 创建线程iscsi_tx_thread传送应答和状态 FETD创建一个Target_Scsi_Cmnd类型的数据接收SCSI命令,将其加入命令队列,唤醒STML的线程STT处理...

Global site tag (gtag.js) - Google Analytics