一. 概述:
FileObserver抽象类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器。必须继承它才能使用。每个FileObserver对象监听一个单独的文件或者文件夹,如果监视的是一个文件夹,那么文件夹下所有的文件和级联子目录的改变都会触发监听的事件。
监听的事件类型:
ACCESS,即文件被访问
MODIFY,文件被 修改
ATTRIB,文件属性被修改,如 chmod、chown、touch 等
CLOSE_WRITE,可写文件被 close
CLOSE_NOWRITE,不可写文件被 close
OPEN,文件被 open
MOVED_FROM,文件被移走,如 mv
MOVED_TO,文件被移来,如 mv、cp
CREATE,创建新文件
DELETE,文件被删除,如 rm
DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
ALL_EVENTS,包括上面的所有事件
二. 代码:
privateTimermTimer; privateMap<String,DeleteFileTimerTask>tasks; StringtargetDirName,targetFileName; publicSDCardFileObserver(Stringpath,StringfileName,intmask){ super(path,mask); mTimer=newTimer(); tasks=newHashMap<String,DeleteFileTimerTask>(); targetDirName=path; targetFileName=fileName; } @Override publicvoidonEvent(intevent,Stringpath){ finalintaction=event&FileObserver.ALL_EVENTS; switch(action){ caseFileObserver.OPEN: Log.d("FileObserver","fileopen;path="+path); break; caseFileObserver.CLOSE_NOWRITE: caseFileObserver.CLOSE_WRITE: Log.d("FileObserver","fileclose;path="+path); if(!path.endsWith(targetFileName))return; if(tasks.containsKey(path)){ DeleteFileTimerTasktask=tasks.get(path); if(task.cancel()){ task=newDeleteFileTimerTask(path); mTimer.schedule(task,30000); } } else{ DeleteFileTimerTasktask=newDeleteFileTimerTask(path); tasks.put(path,task); mTimer.schedule(task,30000); } break; default: break; } } classDeleteFileTimerTaskextendsTimerTask{ privateStringpath; publicDeleteFileTimerTask(Stringpath){ this.path=path; } @Override publicvoidrun(){ StringtmpFile=targetDirName+"/"+targetFileName; Filef=newFile(tmpFile); if(f.exists()&&f.isFile()){ Log.d("FileObserver","deletetmpfile"+path); f.delete(); SDCardFileObserver.this.stopWatching(); } tasks.remove(path); } } }publicclassSDCardFileObserverextendsFileObserver{
喜欢 就关注吧,欢迎投稿!
如果觉得《用FileObserver实现阅后即焚》对你有帮助,请点赞、收藏,并留下你的观点哦!