Use the FileObserver class to monitor the file/directory changes
為了要監視某個檔案是否有被更改,原先寫了個 Thread 去定期檢查檔案的修改時間。不過用 Thread 的問題就是,這 polling 的時間該抓多少才好?久久才查一次,運氣不好的話,檔案被改後,你得等到下次 polling 的時間,才知道。如果將 polling 的時間縮短,常常去檢查,又怕影響整個系統效能。
前幾天查了一下,發現有個 android.os.FileObserver 這個類別。不過這 SDK 都已經出到 1.1r1 了,這個類別的文件還真是簡單到沒有任何的說明,我只能從 API 的名字上去猜他的用法。好在他的 API 沒幾個,大多一看名字,就可猜到他是用來做什麼的。
底下是這個類別的所有 APIs:
看樣子,你可以用這個類別去監視某個目錄或是某個檔案,是否有被存取。
實踐是檢驗真理的唯一標準。因此,我寫了個簡單的程式,來觀察 FileObserver 的行為:
然後,用 adb shell 打幾個指令觀察結果:
# pwd
pwd /sdcard/sam # mv ../a.txt . mv ../a.txt . dir: === dump begin === dir: path=a.txt dir: event list: dir: MOVED_TO dir: === dump end ===
# echo 123 > test.txt
echo 123 > test.txt file: === dump begin === file: path=null file: event list: file: MODIFY file: === dump end === dir: === dump begin === dir: path=test.txt dir: event list: dir: MODIFY dir: === dump end === dir: === dump begin === dir: path=test.txt dir: event list: dir: OPEN dir: === dump end === file: === dump begin === file: path=null file: event list: file: OPEN file: === dump end === dir: === dump begin === dir: path=test.txt dir: event list: dir: MODIFY dir: === dump end === file: === dump begin === file: path=null file: event list: file: MODIFY file: === dump end === dir: === dump begin === dir: path=test.txt dir: event list: dir: CLOSE_WRITE dir: === dump end === file: === dump begin === file: path=null file: event list: file: CLOSE_WRITE file: === dump end === |
反應還蠻即時的,你也可以自己打個其他的指令,試著觀察他的結果,看看是否和你認知的相同。
還沒有仔細 trace 他的原始碼。先問問看,有誰知道 FileObserver 是如何實現這部分的功能?啟動 startWatching(),對系統效能的影響大嗎?
3 則留言:
看了一下source code
底層應該是用 inotify 去實作的
這裡有幾篇inotify 的介紹可以參考一下
http://www.ibm.com/developerworks/linux/library/l-inotify.html
http://www.ibm.com/developerworks/linux/library/l-inotify.html
感謝 XiaoA 提供的資訊,看來用靠 inotify 實現的 FileObserver ,應該在效能上,比 Thread polling 好很多才對。
可以請問一下,我嘗試使用file monitor監控 /proc/net/tcp 想讀取netstat的狀態,但似乎fileObserver無法監控到這個檔案的變化
張貼留言