Android FileObserver 用法

113 篇文章 0 订阅
22 篇文章 0 订阅

当我们要对一个文件或者文件夹进行监听的时候,我们可以使用android api中的android.os.FileObserver ,下面就来介绍如何使用。

 注:onEvent()中的event是与0x40000000或上后的值,在操作之前最好与FileObserver.ALL_EVENTS按位与之后再判断。

1.      如何实现一个FileObserver

首先extends FileObserver 然后覆盖其构造器,最后覆盖

onEvent(int event,String path)方法: 

例子

public class MyFileObserver extends FileObserver {
       /**
        path 是所监听的文件夹或者文件名。
       */
        public MyFileObserver (String path) {
           super(path);
        }
        @Override
        public void onEvent(int event, String path) {
        } 
    }



     

    

2.      监听你所关心的事件:在onEvent(int event,String path)中,通过匹配event的值,可以捕获所发生的事件

例子:

public void onEvent(int event, String path) {
       switch(event){
           case android.os.FileObserver.ALL_EVENTS:
              //所有事件 相当于default的功能
              break;
           case android.os.FileObserver.CREATE:
              //文件被创建
              break;
           case android.os.FileObserver.OPEN :
              //文件被打开
              break;
           case android.os.FileObserver.ACCESS:
              //打开文件后,读文件内容操作
              break;
           case android.os.FileObserver.MODIFY:
              //文件被修改
              break;
           case android.os.FileObserver.ATTRIB:
              //未明操作
              break;
           case android.os.FileObserver.CLOSE_NOWRITE:
              //没有编辑文件,关闭
              break;
           case android.os.FileObserver.CLOSE_WRITE:
              //编辑完文件,关闭
              break;
           case android.os.FileObserver.DELETE:
              //文件被删除
              break;
           case android.os.FileObserver.MOVED_FROM:
              //文件被移动
              break;          
       }
}



注意:在onEvent(int event,String path)中,path返回的是发生事件的文件名,并且不带路径,当我们在某个事件当中需要找到发生事件的文件就要结合它的路径才能找得到。

 

3.      筛选监听事件,防止进入死循环

上面列出了FileObserver所能监听的大部分事件,但是在实际应用当中并不需要监听全部事件,只选择我们自己关心的事件来进行监听就可以,过多的事件监听会导致程序逻辑的混乱。

例如在监听文件被访问的操作时,打开这个文件

case android.os.FileObserver.ACCESS:
              //打开文件后,读文件内容操作
              File file = new File(filePath+File.separator+path);
              String data = readFile(file);//读取文件内容操作
           break;




当程序执行到readFile(file)时,onEvent()方法会再被触发,然后匹配到是ACCESS事件,又回到readFile(file)操作,结果导致死循环。

 

4.      启用文件监听器.

在实现了自己的文件监听器后,下面介绍如何恰当得启用它。

MyFileObserver mObserver = new MyFileObserver("sdcard/myobserver/file");
mObserver.startWatching();//启用文件监听器

取得文件监听器的对象,调用startWatching()开始监听。一开始我也以为就这么简单,后来在使用的时候,发现一旦在做批量任务的时候,文件监听器就不响应了。

所以这是后需要在逻辑处理模块添加线程:

public void onEvent(int event, String path) {
    switch(event){
           case android.os.FileObserver.CLOSE_WRITE:{
              new Thread(){
                  public void run(){
                     //批量任务
                  }
              }.start();
    }
}



       这样在新的文件发生改变或者新的文件被创建的时候,文件监听器仍然可以检测到。

 

5.      停止。调用FileObserver中的stopWatching() 就ok。

原文地址:点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值