转载自:http://blog.csdn.net/happy_6678/article/details/7095012
当我们要对一个文件或者文件夹进行监听的时候,我们可以使用android api中的android.os.FileObserver ,下面就来介绍如何使用。
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) {
}
1. }
2.
3. 监听你所关心的事件:在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返回的是发生事件的文件名,并且不带路径,当我们在某个事件当中需要找到发生事件的文件就要结合它的路径才能找得到。
4. 筛选监听事件,防止进入死循环
上面列出了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)操作,结果导致死循环。
5. 启用文件监听器.
在实现了自己的文件监听器后,下面介绍如何恰当得启用它。
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();
}
}
这样在新的文件发生改变或者新的文件被创建的时候,文件监听器仍然可以检测到。
6. 停止。调用FileObserver中的stopWatching() 就ok。
http://yzhong-sa.iteye.com/blog/468150
http://mobius.yo2.cn/articles/recursive_file_observer.html