JAVA文件监听

这一片博客将介绍通过JAVA实现监听文件的变更,提供一种解决方案。

文件改变接口

import java.io.File;

public interface FileMonitorListener
{
   void fileChanged(File file);
}

文件监听类

import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 文件监听
 *
 * @author jianggujin
 *
 */
public class FileMonitor
{
   /** 定时器 **/
   private Timer timer;
   /** 监听的文件 **/
   private HashMap<File, Long> monitorFiles;
   /** 监听器,采用弱引用,避免影响垃圾回收 **/
   private Collection<WeakReference<FileMonitorListener>> listeners;

   /**
    * 构造方法,默认1秒监控一次
    */
   public FileMonitor()
   {
      this(1000);
   }

   /**
    * 构造方法
    *
    * @param pollingInterval
    *           监听时间间隔
    */
   public FileMonitor(long pollingInterval)
   {
      monitorFiles = new HashMap<File, Long>();
      listeners = new ArrayList<WeakReference<FileMonitorListener>>();
      timer = new Timer(true);
      timer.schedule(new FileMonitorNotifier(), 0, pollingInterval);
   }

   /**
    * 停止监听
    */
   public void stop()
   {
      timer.cancel();
   }

   /**
    * 添加监听文件
    *
    * @param file
    */
   public void addFile(File file)
   {
      if (!monitorFiles.containsKey(file))
      {
         long modifiedTime = file.exists() ? file.lastModified() : -1;
         monitorFiles.put(file, new Long(modifiedTime));
      }
   }

   /**
    * 移除监听文件
    *
    * @param file
    */
   public void removeFile(File file)
   {
      monitorFiles.remove(file);
   }

   /**
    * 添加监听器
    *
    * @param fileListener
    */
   public void addListener(FileMonitorListener fileListener)
   {
      // 判断监听器是否已存在
      for (Iterator<WeakReference<FileMonitorListener>> iterator = listeners
            .iterator(); iterator.hasNext();)
      {
         if (iterator.next().get() == fileListener)
         {
            return;
         }
      }
      // 以弱引用的方式添加监听器
      listeners.add(new WeakReference<FileMonitorListener>(fileListener));
   }

   /**
    * 移除监听器
    *
    * @param fileListener
    */
   public void removeListener(FileMonitorListener fileListener)
   {
      for (Iterator<WeakReference<FileMonitorListener>> iterator = listeners
            .iterator(); iterator.hasNext();)
      {
         if (iterator.next().get() == fileListener)
         {
            iterator.remove();
            break;
         }
      }
   }

   /**
    * 文件监听通知任务
    *
    * @author jianggujin
    *
    */
   private class FileMonitorNotifier extends TimerTask
   {
      public void run()
      {
         // 获得文件列表
         Collection<File> files = new ArrayList<File>(monitorFiles.keySet());
         // 遍历
         for (Iterator<File> iterator = files.iterator(); iterator.hasNext();)
         {
            File file = iterator.next();
            long lastModifiedTime = monitorFiles.get(file).longValue();
            long newModifiedTime = file.exists() ? file.lastModified() : -1;
            // 最后修改时间不同,认为文件修改
            if (newModifiedTime != lastModifiedTime)
            {
               // 修改原信息
               monitorFiles.put(file, newModifiedTime);
               // 遍历监听器
               for (Iterator<WeakReference<FileMonitorListener>> iterator2 = listeners
                     .iterator(); iterator2.hasNext();)
               {
                  WeakReference<FileMonitorListener> reference = iterator2
                        .next();
                  FileMonitorListener listener = (FileMonitorListener) reference
                        .get();
                  // 如果监听器已经被垃圾回收,则此时监听器为null
                  if (listener == null)
                  {
                     iterator2.remove();
                  }
                  else
                  {
                     listener.fileChanged(file);
                  }
               }
            }
         }
      }
   }

   public static void main(String[] args)
   {
      FileMonitor monitor = new FileMonitor();
      monitor.addFile(new File("test.txt"));
      monitor.addListener(new FileMonitorListener()
      {

         public void fileChanged(File file)
         {
            System.out.println(file.getName() + " changed!");
         }
      });
      // 启动一个线程,防止程序退出
      new Thread()
      {
         public void run()
         {
            while (true)
            {
            }
         };
      }.start();
   }
}

在JDK1.7中,JAVA提供了监听文件的方法,参考示例如下:

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKind;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        Path myDir = Paths.get("test.txt");
        try {
           WatchService watcher = myDir.getFileSystem().newWatchService();
           myDir.register(watcher, StandardWatchEventKind.ENTRY_CREATE,
           StandardWatchEventKind.ENTRY_DELETE, StandardWatchEventKind.ENTRY_MODIFY);
           WatchKey watckKey = watcher.take();
           List<WatchEvent<?>> events = watckKey.pollEvents();
           for (WatchEvent event : events) {
                if (event.kind() == StandardWatchEventKind.ENTRY_CREATE) {
                    System.out.println("Created: " + event.context().toString());
                }
                if (event.kind() == StandardWatchEventKind.ENTRY_DELETE) {
                    System.out.println("Delete: " + event.context().toString());
                }
                if (event.kind() == StandardWatchEventKind.ENTRY_MODIFY) {
                    System.out.println("Modify: " + event.context().toString());
                }
            }  

        } catch (Exception e) {
            System.out.println("Error: " + e.toString());
        }
    }
} 
时间: 2024-08-09 12:09:32

JAVA文件监听的相关文章

使用xmlhttp和Java session监听改善站内消息系统

session|xml 使用xmlhttp和Java session监听改善站内消息系统 bromon 原创  引自:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=25340 这个题目含有许多需要解释的概念,最容易说明的是"站内消息",这是很多论坛都有的功能,可以通过web向其他的在线用户发送消息,很多用户都使用过.站内消息的第一个好处是大家都不需要安装客户端,你不用知道对方的MSN或

JAVA键盘监听,错误在哪里

问题描述 JAVA键盘监听,错误在哪里 解决方案 java 键盘监听java 键盘监听Java:键盘全局监听 解决方案二: http://zhidao.baidu.com/question/577201357.html?qbl=relate_question_0 解决方案三: 编译问题,你这个方法调用参数类型是错误的,键盘监听事件的参数是addKeyListener的参数必须是实现KeyListener这个接口的类. 你的mb类型定义的是JPanel,所以会报编译错误.你需要定义一个类实现Key

java如何监听打印机的内容

问题描述 java如何监听打印机的内容 需求是这样的,想在打印机打印小票之前捕捉小票内容,然后修改小票内容再打印.跪求大神们提供代码,文档,思路等信息,谢谢了 解决方案 我也想知道啊 哪位大神指点一下 解决方案二: java没法做系统一级的,需要c cpp然后给java调用.

事件处理-新手求教大神,java事件监听问题

问题描述 新手求教大神,java事件监听问题 import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JLabel; public class EventModelDemo implements ActionListener{ JLabel tips=new

java中监听接口里面的onclick方法为什么被称为回调方法

问题描述 java中监听接口里面的onclick方法为什么被称为回调方法 那普通接口有回调方法吗,普通类有回调方法吗, 回调方法是如何定义的 解决方案 你别被回调这个词搞蒙了,其实就是把方法当做参数而已 解决方案二: 因为onclick你定义了,不是自己调用,而是间接由按钮点击后系统类库去调用,所以叫回调. 英文叫做callback. 解决方案三: 回调方法简单的说就是a方法都用b方法,b方法执行过程中需要调用a方法,callback 解决方案四: [个人向]Android回调接口的实现方法ja

关于java事件监听的问题

问题描述 关于java事件监听的问题 有个登陆按钮 点击后登陆 我想得是按下回车键登陆 但是为什么不能在按键事件监听中调用那个点击事件那 解决方案 java事件监听监听事件问题JAVA监听键盘事件 解决方案二: 给那个按钮设个快捷键,让它在按下回车的时候触发监听事件 解决方案三: 提交按钮和enter按键的功能一样,只是一个是click事件,enter是keypress事件. 解决方案四: 可以在相应的设置中设置为快捷键,然后调用.或者设置shift顺序,调用doClick方法,差不多就是这样了

求Java一监听0.0.0.0地址的Socket代码,做打洞用,找了半天没找到,谢谢!

问题描述 求Java一监听0.0.0.0地址的Socket代码,找了半天没找到,谢谢!serverSocket=newServerSocket();serverSocket.setReuseAddress(true);serverSocket.bind(newInetSocketAddress(InetAddress.getByName("192.168.1.2"),intPoint));这个监听的是192.168.1.2想搞为0.0.0.0,谢谢!直接绑定的这个能为0.0.0.0,s

Java怎么监听系统剪贴板的变化 ?

问题描述 不是在自己的程序中监听剪贴板的变化 而是系统的使用中发生了剪切复制这类操作Java怎么监听 ? 需要JNI? 还是开个线程每一秒都做一次对比么 ...... 但是这样的话开销就不小了 请大家赐教 问题补充:AngelAndAngel 写道 解决方案 不然要是有这种软件 就天下打乱了.你做什么都可能监听到,那就完咯 呵呵.解决方案二:哦 这个东西不能办到,而且是不可能办到的. 而且操作系统是不可能让你这么干的 呵呵 相信我吧兄弟.解决方案三:还有 你是用的swing吧.解决方案四:看下面

Android创建文件实现对文件监听示例_Android

复制代码 代码如下: public class FileObserverTest extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyFileObserver mfo = new MyFileObserver(getApplicationContext().getFilesDir() + "/data.txt"