Android如何監(jiān)測文件夾內(nèi)容變化詳解
一. 概述:
android.os包下的FileObserver類是一個用于監(jiān)聽文件訪問、創(chuàng)建、修改、刪除、移動等操作的監(jiān)聽器,基于linux的INotify。FileObserver是個抽象類,必須繼承它才能使用。每個FileObserver對象監(jiān)聽一個單獨的文件或者文件夾,如果監(jiān)視的是一個文件夾,那么文件夾下所有的文件和級聯(lián)子目錄的改變都會觸發(fā)監(jiān)聽的事件。
FileObserver簡介Android.os包下的FileObserver類是一個用于監(jiān)聽文件訪問、創(chuàng)建、修改、刪除、移動等操作的監(jiān)聽器,基于Linux的INotify。
FileObserver是個抽象類,必須繼承它才能使用。每個FileObserver對象監(jiān)聽一個單獨的文件或者文件夾,如果監(jiān)視的是一個文件夾,那么文件夾下所有的文件和級聯(lián)子目錄的改變都會觸發(fā)監(jiān)聽的事件。
二. 監(jiān)聽的事件類型:
ACCESS,即文件被訪問
? ? ?MODIFY,文件被 修改
? ? ?ATTRIB,文件屬性被修改,如 chmod、chown、touch 等
? ? ?CLOSE_WRITE,可寫文件被 close
? ? ?CLOSE_NOWRITE,不可寫文件被 close
? ? ?OPEN,文件被 open
? ? ?MOVED_FROM,文件被移走,如 mv
? ? ?MOVED_TO,文件被移來,如 mv、cp
? ? ?CREATE,創(chuàng)建新文件
? ? ?DELETE,文件被刪除,如 rm
? ? ?DELETE_SELF,自刪除,即一個可執(zhí)行文件在執(zhí)行時刪除自己
? ? ?MOVE_SELF,自移動,即一個可執(zhí)行文件在執(zhí)行時移動自己
? ? ?CLOSE,文件被關(guān)閉,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
? ? ?ALL_EVENTS,包括上面的所有事件
三.實例
import com.example.androidemail.R;
import com.example.androidemail.R.layout;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileObserver;
public class AndroidFileListenerActivity extends Activity {
private FileObserver mFileObserver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(null == mFileObserver) {
mFileObserver = new SDCardFileObserver(Environment.getExternalStorageDirectory().getPath());
mFileObserver.startWatching(); //開始監(jiān)聽
}
}
public void onDestory() {
if(null != mFileObserver) mFileObserver.stopWatching(); //停止監(jiān)聽
}
static class SDCardFileObserver extends FileObserver {
//mask:指定要監(jiān)聽的事件類型,默認為FileObserver.ALL_EVENTS
public SDCardFileObserver(String path, int mask) {
super(path, mask);
}
public SDCardFileObserver(String path) {
super(path);
}
@Override
public void onEvent(int event, String path) {
final int action = event & FileObserver.ALL_EVENTS;
switch (action) {
case FileObserver.ACCESS:
System.out.println("event: 文件或目錄被訪問, path: " + path);
break;
case FileObserver.DELETE:
System.out.println("event: 文件或目錄被刪除, path: " + path);
break;
case FileObserver.OPEN:
System.out.println("event: 文件或目錄被打開, path: " + path);
break;
case FileObserver.MODIFY:
System.out.println("event: 文件或目錄被修改, path: " + path);
break;
case FileObserver.CREATE:
System.out.println("event: 文件或目錄被創(chuàng)建, path: " + path);
break;
}
}
}
}
onEvent是回調(diào),系統(tǒng)監(jiān)聽到事件后會觸發(fā)此事件,參數(shù)event就是上面所說的事件類型,參數(shù)path就是觸發(fā)事件的目錄,鑒定只針對于該層目錄,其他層次無效。
我們大多數(shù)需要監(jiān)聽path目錄下的所有文件對象的相關(guān)操作,那該如何是好呢?解決問題方法之一就是重新實現(xiàn)FileObserver類,
下面是對FileObserver類的重寫實現(xiàn)過程
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import android.os.FileObserver;
import android.util.Log;
@SuppressWarnings(value = { "rawtypes", "unchecked" })
public class MultiFileObserver extends FileObserver {
/** Only modification events */
public static int CHANGES_ONLY = CREATE | MODIFY |DELETE | CLOSE_WRITE
| DELETE_SELF | MOVE_SELF | MOVED_FROM | MOVED_TO;
private List<SingleFileObserver> mObservers;
private String mPath;
private int mMask;
public MuityFileObserver(String path) {
this(path, ALL_EVENTS);
}
public MuityFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
mMask = mask;
}
@Override
public void startWatching() {
if (mObservers != null)
return;
mObservers = new ArrayList<SingleFileObserver>();
Stack<String> stack = new Stack<String>();
stack.push(mPath);
while (!stack.isEmpty()) {
String parent = stack.pop();
mObservers.add(new SingleFileObserver(parent, mMask));
File path = new File(parent);
File[] files = path.listFiles();
if (null == files)
continue;
for (File f : files) {
if (f.isDirectory() && !f.getName().equals(".")
&& !f.getName().equals("..")) {
stack.push(f.getPath());
}
}
}
for (int i = 0; i < mObservers.size(); i++) {
SingleFileObserver sfo = mObservers.get(i);
sfo.startWatching();
}
};
@Override
public void stopWatching() {
if (mObservers == null)
return;
for (int i = 0; i < mObservers.size(); i++) {
SingleFileObserver sfo = mObservers.get(i);
sfo.stopWatching();
}
mObservers.clear();
mObservers = null;
};
@Override
public void onEvent(int event, String path) {
switch (event) {
case FileObserver.ACCESS:
Log.i("RecursiveFileObserver", "ACCESS: " + path);
break;
case FileObserver.ATTRIB:
Log.i("RecursiveFileObserver", "ATTRIB: " + path);
break;
case FileObserver.CLOSE_NOWRITE:
Log.i("RecursiveFileObserver", "CLOSE_NOWRITE: " + path);
break;
case FileObserver.CLOSE_WRITE:
Log.i("RecursiveFileObserver", "CLOSE_WRITE: " + path);
break;
case FileObserver.CREATE:
Log.i("RecursiveFileObserver", "CREATE: " + path);
break;
case FileObserver.DELETE:
Log.i("RecursiveFileObserver", "DELETE: " + path);
break;
case FileObserver.DELETE_SELF:
Log.i("RecursiveFileObserver", "DELETE_SELF: " + path);
break;
case FileObserver.MODIFY:
Log.i("RecursiveFileObserver", "MODIFY: " + path);
break;
case FileObserver.MOVE_SELF:
Log.i("RecursiveFileObserver", "MOVE_SELF: " + path);
break;
case FileObserver.MOVED_FROM:
Log.i("RecursiveFileObserver", "MOVED_FROM: " + path);
break;
case FileObserver.MOVED_TO:
Log.i("RecursiveFileObserver", "MOVED_TO: " + path);
break;
case FileObserver.OPEN:
Log.i("RecursiveFileObserver", "OPEN: " + path);
break;
default:
Log.i("RecursiveFileObserver", "DEFAULT(" + event + " : " + path);
break;
}
}
/**
* Monitor single directory and dispatch all events to its parent, with full
* path.
*/
class SingleFileObserver extends FileObserver {
String mPath;
public SingleFileObserver(String path) {
this(path, ALL_EVENTS);
mPath = path;
}
public SingleFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
}
@Override
public void onEvent(int event, String path) {
String newPath = mPath + "/" + path;
MultiFileObserver .this.onEvent(event, newPath);
}
}
}
總結(jié)
到此這篇關(guān)于Android如何監(jiān)測文件夾內(nèi)容變化的文章就介紹到這了,更多相關(guān)Android監(jiān)測文件夾內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 仿摩拜單車共享單車進度條實現(xiàn)StepView效果
這篇文章主要介紹了android 仿摩拜單車共享單車進度條實現(xiàn)StepView效果的實例,通過定義五個狀態(tài),分別為:為完成、正在進行、已完成、終點完成、終點未完成。具體實現(xiàn)代碼,大家參考下2017-03-03
Android如何實現(xiàn)一個DocumentProvider示例詳解
這篇文章主要為大家介紹了Android如何實現(xiàn)一個DocumentProvider示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
淺談Android開發(fā)中ListView控件性能的一些優(yōu)化方法
這篇文章主要介紹了Android開發(fā)中ListView控件性能的一些優(yōu)化方法,需要的朋友可以參考下2016-01-01
android中一些特殊字符(如:←↑→↓等箭頭符號)的Unicode碼值
這篇文章主要介紹了android中一些特殊字符(如:←↑→↓等箭頭符號)的Unicode碼值,需要的朋友可以參考下2017-03-03

