- 浏览: 232815 次
- 性别:
- 来自: 广东
文章分类
最新评论
-
wangmuchang:
解压需要密码
CAS单点登录之测试应用 -
ayang722:
首先就要在运行报表birt的IEngineTask中加入, J ...
birt配置动态数据源 -
lihong11:
very good!
js常用方法 -
qtlkw:
你共享出来为什么要密码?要密码为何要共享出来?汗
CAS单点登录之测试应用 -
lishouxinghome:
请问如何获得用户的Id呢,往指点
使用 CAS 在 Tomcat 中实现单点登录
1.在web.xml配置文件监视器。
2.监视器实现FileModifyListener.java
3.线程实现类FileThread.java
4.其他工具类
4.1 FileListener.java
4.2 FileMonitor.java
4.3 FileOperator.java
<listener> <listener-class>com.wgj.filter.FileModifyListener </listener-class> </listener>
2.监视器实现FileModifyListener.java
package com.wgj.filter; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; public class FileModifyListener implements ServletContextListener { FileThread fileThread; Logger log = Logger.getLogger(FileModifyListener.class); public FileModifyListener() { } @Override public void contextDestroyed(ServletContextEvent sce) { } @Override public void contextInitialized(ServletContextEvent sce) { fileThread = new FileThread(); fileThread.setDaemon(true);//作为后台线程运行 log.debug("File Listener Initialized: OK" ); try { // System.out.println("File Listener Initialized: OK"); fileThread.start(); } catch(Exception e) { log.debug("File Listener contextInitialized:",e); } } }
3.线程实现类FileThread.java
package com.wgj.home; import java.io.File; import javax.servlet.ServletContext; public class FileThread extends Thread { private File fileDir = null; private String monitorPath = null; private String storePath = null; FileMonitor monitorFileDir =null; FileMonitor monitorFile =null; public FileThread() { monitorPath = "c:\\"; storePath = "e:\"; FileMonitor monitorFileDir = new FileMonitor(1000); FileMonitor monitorFile = new FileMonitor(1000); fileDir = new File(monitorPath); monitorFileDir.addFile(fileDir); monitorFileDir.addListener(new MonitorFileDirChanger(monitorFile, fileDir)); File[] files = fileDir.listFiles(); for (int i = 0; i < files.length; i++) { monitorFile.addFile(files[i]); monitorFile.addListener(new MonitorFileChanger()); } } public void run() { while (!false) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } private class MonitorFileChanger implements FileListener { public void fileChanged(File file) { FileOperator fileCopy = new FileOperator(); fileCopy.copyFile(monitorPath + "\\" + file.getName(), storePath + file.getName()); } } private class MonitorFileDirChanger implements FileListener { FileMonitor monitorFile; File fileDir; public MonitorFileDirChanger(FileMonitor monitorFile, File fileDir) { this.monitorFile = monitorFile; this.fileDir = fileDir; } public void fileChanged(File file) { monitorFile.removeAllListener(); File[] files = fileDir.listFiles(); for (int i = 0; i < files.length; i++) { monitorFile.addFile(files[i]); monitorFile.addListener(new MonitorFileChanger()); } FileOperator fileCopy = new FileOperator(); fileCopy.copyFolder(monitorPath, storePath); } } }
4.其他工具类
4.1 FileListener.java
package com.wgj.home; import java.io.File; /** * Interface for listening to disk file changes. * @see FileMonitor * * @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a> */ public interface FileListener { /** * Called when one of the monitored files are created, deleted * or modified. * * @param file File which has been changed. */ void fileChanged (File file); }
4.2 FileMonitor.java
package com.wgj.home; import java.util.*; import java.io.File; import java.lang.ref.Reference;//WeakReference; /** * Class for monitoring changes in disk files. * Usage: * * 1. Implement the FileListener interface. * 2. Create a FileMonitor instance. * 3. Add the file(s)/directory(ies) to listen for. * * fileChanged() will be called when a monitored file is created, * deleted or its modified time changes. * * @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a> */ public class FileMonitor { private Timer timer_; private HashMap files_; // File -> Long private Collection listeners_; // of WeakReference(FileListener) /** * Create a file monitor instance with specified polling interval. * * @param pollingInterval Polling interval in milli seconds. */ public FileMonitor (long pollingInterval) { files_ = new HashMap(); listeners_ = new ArrayList(); timer_ = new Timer (true); timer_.schedule (new FileMonitorNotifier(), 0, pollingInterval); } /** * Stop the file monitor polling. */ public void stop() { timer_.cancel(); } /** * Add file to listen for. File may be any java.io.File (including a * directory) and may well be a non-existing file in the case where the * creating of the file is to be trepped. * <p> * More than one file can be listened for. When the specified file is * created, modified or deleted, listeners are notified. * * @param file File to listen for. */ public void addFile (File file) { if (!files_.containsKey (file)) { long modifiedTime = file.exists() ? file.lastModified() : -1; files_.put (file, new Long (modifiedTime)); } } /** * Remove specified file for listening. * * @param file File to remove. */ public void removeFile (File file) { files_.remove (file); } /** * Add listener to this file monitor. * * @param fileListener Listener to add. */ public void addListener (FileListener fileListener) { // Don't add if its already there for (Iterator i = listeners_.iterator(); i.hasNext(); ) { // Reference reference = (Reference) i.next(); FileListener listener = (FileListener) i.next();//reference.get(); if (listener == fileListener) return; } // Use WeakReference to avoid memory leak if this becomes the // sole reference to the object. listeners_.add (fileListener);//new Reference ( } /** * Remove listener from this file monitor. * * @param fileListener Listener to remove. */ public void removeListener (FileListener fileListener) { for (Iterator i = listeners_.iterator(); i.hasNext(); ) { // Reference reference = (Reference) i.next(); FileListener listener = (FileListener) i.next();//reference.get(); if (listener == fileListener) { i.remove(); break; } } } /** * Remove listener from this file monitor. * * @param fileListener Listener to remove. */ public void removeAllListener () { for (Iterator i = listeners_.iterator(); i.hasNext(); ) { // Reference reference = (Reference) i.next(); FileListener listener = (FileListener) i.next();//reference.get(); i.remove(); } } /** * This is the timer thread which is executed every n milliseconds * according to the setting of the file monitor. It investigates the * file in question and notify listeners if changed. */ private class FileMonitorNotifier extends TimerTask { public void run() { // Loop over the registered files and see which have changed. // Use a copy of the list in case listener wants to alter the // list within its fileChanged method. Collection files = new ArrayList (files_.keySet()); for (Iterator i = files.iterator(); i.hasNext(); ) { File file = (File) i.next(); long lastModifiedTime = ((Long) files_.get (file)).longValue(); long newModifiedTime = file.exists() ? file.lastModified() : -1; // Chek if file has changed if (newModifiedTime != lastModifiedTime) { // Register new modified time files_.put (file, new Long (newModifiedTime)); // Notify listeners for (Iterator j = listeners_.iterator(); j.hasNext(); ) { //Reference reference = (Reference) j.next(); FileListener listener = (FileListener) j.next(); // Remove from list if the back-end object has been GC'd if (listener == null) j.remove(); else listener.fileChanged (file); } } } } } /** * Test this class. * * @param args Not used. */ public static void main (String args[]) { // Create the monitor FileMonitor monitor = new FileMonitor (1000); // Add some files to listen for monitor.addFile (new File ("E:\\deploy\\test")); monitor.addFile (new File ("E:\\deploy\\test\\1.txt")); // Add a dummy listener monitor.addListener (monitor.new TestListener()); // Avoid program exit while (!false) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } } private class TestListener implements FileListener { public void fileChanged (File file) { System.out.println ("File changed: " + file); } } }
4.3 FileOperator.java
package com.wgj.home; import java.io.*; public class FileOperator { public FileOperator() { } /** * 新建目录 * @param folderPath String 如 c:/fqf * @return boolean */ public void newFolder(String folderPath) { try { String filePath = folderPath; filePath = filePath.toString(); java.io.File myFilePath = new java.io.File(filePath); if (!myFilePath.exists()) { myFilePath.mkdir(); } } catch (Exception e) { System.out.println("新建目录操作出错"); e.printStackTrace(); } } /** * 新建文件 * @param filePathAndName String 文件路径及名称 如c:/fqf.txt * @param fileContent String 文件内容 * @return boolean */ public void newFile(String filePathAndName, String fileContent) { try { String filePath = filePathAndName; filePath = filePath.toString(); File myFilePath = new File(filePath); if (!myFilePath.exists()) { myFilePath.createNewFile(); } FileWriter resultFile = new FileWriter(myFilePath); PrintWriter myFile = new PrintWriter(resultFile); String strContent = fileContent; myFile.println(strContent); resultFile.close(); } catch (Exception e) { System.out.println("新建目录操作出错"); e.printStackTrace(); } } /** * 删除文件 * @param filePathAndName String 文件路径及名称 如c:/fqf.txt * @param fileContent String * @return boolean */ public void delFile(String filePathAndName) { try { String filePath = filePathAndName; filePath = filePath.toString(); java.io.File myDelFile = new java.io.File(filePath); myDelFile.delete(); } catch (Exception e) { System.out.println("删除文件操作出错"); e.printStackTrace(); } } /** * 删除文件夹 * @param filePathAndName String 文件夹路径及名称 如c:/fqf * @param fileContent String * @return boolean */ public void delFolder(String folderPath) { try { delAllFile(folderPath); //删除完里面所有内容 String filePath = folderPath; filePath = filePath.toString(); java.io.File myFilePath = new java.io.File(filePath); myFilePath.delete(); //删除空文件夹 } catch (Exception e) { System.out.println("删除文件夹操作出错"); e.printStackTrace(); } } /** * 删除文件夹里面的所有文件 * @param path String 文件夹路径 如 c:/fqf */ public void delAllFile(String path) { File file = new File(path); if (!file.exists()) { return; } if (!file.isDirectory()) { return; } String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { temp.delete(); } if (temp.isDirectory()) { delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件 delFolder(path+"/"+ tempList[i]);//再删除空文件夹 } } } /** * 复制单个文件 * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public void copyFile(String oldPath, String newPath) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath); if (oldfile.exists()) { //文件存在时 InputStream inStream = new FileInputStream(oldPath); //读入原文件 FileOutputStream fs = new FileOutputStream(newPath); byte[] buffer = new byte[1444]; int length; while ( (byteread = inStream.read(buffer)) != -1) { bytesum += byteread; //字节数 文件大小 fs.write(buffer, 0, byteread); } inStream.close(); } } catch (Exception e) { System.out.println("复制单个文件操作出错"); e.printStackTrace(); } } /** * 复制整个文件夹内容 * @param oldPath String 原文件路径 如:c:/fqf * @param newPath String 复制后路径 如:f:/fqf/ff * @return boolean */ public void copyFolder(String oldPath, String newPath) { try { (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹 File a=new File(oldPath); //System.out.println("oldPath:"+oldPath); String[] file=a.list(); File temp=null; for (int i = 0; i < file.length; i++) { if(oldPath.endsWith(File.separator)){ temp=new File(oldPath+file[i]); } else{ temp=new File(oldPath+File.separator+file[i]); } if(temp.isFile()){ FileInputStream input = new FileInputStream(temp); FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString()); byte[] b = new byte[1024 * 5]; int len; while ( (len = input.read(b)) != -1) { output.write(b, 0, len); } output.flush(); output.close(); input.close(); } if(temp.isDirectory()){//如果是子文件夹 copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]); } } } catch (Exception e) { System.out.println("copying all file error");//复制整个文件夹内容操作出错 e.printStackTrace(); } } /** * 移动文件到指定目录 * @param oldPath String 如:c:/fqf.txt * @param newPath String 如:d:/fqf.txt */ public void moveFile(String oldPath, String newPath) { copyFile(oldPath, newPath); delFile(oldPath); } /** * 移动文件到指定目录 * @param oldPath String 如:c:/fqf.txt * @param newPath String 如:d:/fqf.txt */ public void moveFolder(String oldPath, String newPath) { copyFolder(oldPath, newPath); delFolder(oldPath); } }
发表评论
-
ssh框架加入atomikos分布式事务管理
2015-01-06 18:48 1470一、概念 分布式事务分布式事务是指事务 ... -
Spring 动态切换数据源
2014-05-09 14:30 3640一、开篇 这里整合分别采用了Hibernate和MyB ... -
Spring切入点表达式常用写法
2014-05-09 14:25 818自从使用AspectJ风格切面配置,使得Spring的切面配 ... -
Spring中线程池的应用
2014-03-24 11:03 899多线程并发处理起来通常比较麻烦,如果你使用spring容器来 ... -
Spring线程池开发实战
2014-03-24 11:02 756本文提供了三个Spring多线程开发的例子,由浅入深,由于例 ... -
JSch - Java实现的SFTP(文件上传详解篇)
2013-11-21 09:36 901JSch是Java Secure Channel的缩写。J ... -
JAVA线程池ThreadPoolExecutor
2013-07-17 14:45 899java.util.concurrent.ThreadPoo ... -
log4j.properties 使用说明
2013-05-29 10:54 812一、Log4j简介Log4j有三个主要的组件:Logger ... -
eclipse安装反编译插件(附jad下载)
2012-12-12 10:45 826一、eclipse反编译插件Jadclipse jadclip ... -
web.xml 配置404和500错误的自定义页面
2012-12-07 11:47 816web.xml <error-page>< ... -
java内存溢出
2012-06-28 18:57 871一、常见的Java内存溢出 ... -
List Set Map区别
2012-12-25 17:54 918List有序key和value都能重 ... -
Java 自定义Annotation(元数据、注解)
2011-08-05 11:50 1910Annotation在java的世界正铺天盖地展开,有空写这一 ... -
LOG4J properties 配置文件
2011-06-29 16:31 1174一、参数意义说明1、输出级别的种类 ERROR、 ... -
servlet输出一个文件
2010-11-10 18:33 1170String fileName= file.getName() ... -
关于RSS、RDF、ATOM和Feed
2010-11-02 09:48 1225RSS被不同的技术团体做不同的解释,分别有 Rich Site ... -
正确理解Traceback的含义
2010-11-02 09:44 1010Traceback是Blog的一个重要 ... -
关于Serializable的serialVersionUID
2010-10-26 09:10 1757众所周知,当某class实现了Serializable接口 ... -
获得CLASSPATH之外路径的方法
2010-10-14 10:37 961URL base = this.getClass().getR ... -
操作properties文件
2010-10-14 10:30 807发个例子大家自己看哈.package control; im ...
相关推荐
《深入理解Windows文件监视器:系统安全的得力助手》 Windows文件监视器是一款专为系统安全设计的实用工具,其主要功能是对指定的硬盘分区或者特定目录进行实时监控,以便捕捉并记录下任何关于文件及子文件夹的变动...
非常好文件监视器,能监视系统盘或全部磁盘创建、修改、重命名或删除文件的信息,帮助测试某些软件。而且可用于探测一些不明软件安全性(如果没有恶意创建、修改文件,那就比较安全)。本软件由delphi6.0制作。
文件监视器是一款强大的工具,主要用于实时监控系统中文件和文件夹的访问、读取、写入、修改等操作。在IT行业中,理解并掌握文件监视器的使用对于故障排查、性能优化以及安全审计等方面具有重要意义。 一、文件监视...
文件监视器,通常被称作File Monitor,是一种实用工具,用于实时跟踪和记录系统中文件和目录的修改、创建、删除等操作。这种工具在软件开发、数据分析、系统调试和故障排查等领域非常有用,因为它可以帮助用户了解...
《Windows文件监视器v1.0:洞察系统文件变化的利器》 在IT领域,对文件系统的监控是一项至关重要的任务,特别是在系统维护、软件开发、数据安全等方面。Windows文件监视器v1.0正是这样一款专为Windows操作系统设计...
Windows文件监视器是一款专为Windows操作系统设计的实用工具,它主要功能是监控系统中的文件活动,帮助用户检测和跟踪潜在的后门程序或其他恶意软件的行为。后门程序通常被黑客用于远程控制或非法访问用户的计算机,...
标题中的“c文件监视器源代码.rar_doc_文件 监视_文件监视”指的是一个以C++编程语言实现的文件监视器的源代码压缩包,其中包含了一个名为“c#文件监视器源代码.doc”的文档,很可能是用DOC格式记录了源代码的详细...
对于需要监视的某个exe可执行文件,确保它一直在运行,或宕掉后需要自动启动该进程,则可以通过进程监视器程序,实时监视该进程是否存在,不存在则进程监视器会将此进程启动。示例中用windows自带的画图作为监视进程...
标题 "用C#做的文件监视器" 描述的是一个使用C#编程语言开发的应用程序,其功能是实时监控指定文件夹内文件的改动情况。这个简单的项目为开发者提供了一个基础框架,他们可以通过阅读和理解代码来学习如何在C#中实现...
文件监视器
**VC文件监视器源代码详解** 在IT领域,文件监视是一项关键的技术,它允许开发者跟踪、记录和分析对文件系统中的文件和目录的各种操作。"VC文件监视器源代码"是一个这样的工具,专为Visual C++(VC)开发,用于监控...
帮助你监视硬盘上文件的改变,速度很快 可检测: 1、文件或文件夹的新建、删除、重命名 2、文件大小的改变 3、文件(文件夹)属性的改变 4、文件(文件夹)访问权限的改变 5、文件(文件夹)创建时间的改变 6、文件...
《VC++文件监视器:深度解析与应用》 在IT领域,实时监控文件或目录的改动是一项重要的功能,尤其在软件开发、数据跟踪以及系统管理中。本文将深入探讨使用Visual C++(简称VC++)实现文件监视器的技术细节,以帮助...
### C#文件监视器源代码知识点解析 #### 一、概述 本文档旨在解析一个用C#编写的文件监视器程序的源代码。该程序的主要功能是对指定目录下的文件进行实时监控,包括检测文件的修改、新增、删除等操作,并记录这些...