2009年2月16日 星期一

誰有用過 FileObserver ?

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 則留言:

Unknown 提到...

看了一下source code
底層應該是用 inotify 去實作的
這裡有幾篇inotify 的介紹可以參考一下
http://www.ibm.com/developerworks/linux/library/l-inotify.html
http://www.ibm.com/developerworks/linux/library/l-inotify.html

samlu 提到...

感謝 XiaoA 提供的資訊,看來用靠 inotify 實現的 FileObserver ,應該在效能上,比 Thread polling 好很多才對。

pippen 提到...

可以請問一下,我嘗試使用file monitor監控 /proc/net/tcp 想讀取netstat的狀態,但似乎fileObserver無法監控到這個檔案的變化

張貼留言