原理
FileObserver 是 Android 中一个用于监听文件或目录变化的类。当我们实例化 FileObserver 对象,并启动它的 startWatching() 方法后,它就会开始监听指定的文件或目录。当这个文件或目录被修改时,FileObserver 将收到通知并触发回调函数,从而让我们可以相应地处理这些变化。
FileObserver 的原理是基于 Linux 的 inotify 机制。inotify(即“inode notify”)是 Linux 内核中的一种文件系统监视方法,允许应用程序在文件系统事件发生时接收通知。当我们使用 FileObserver 类来监视文件或目录时,Android 系统会在底层使用 inotify 机制来进行操作。当指定的文件或目录发生变化时,内核将发送一个 inotify 事件,并将其传送到我们的应用程序中。
具体来说,当我们使用 FileObserver 对象监视文件或目录时,Android 系统会在后台创建一个新线程,该线程将持续运行以接收 inotify 事件。当出现任何与监视的文件或目录相关的事件(例如文件创建、删除、修改或移动等事件)时,系统将通过该线程向我们的进程发送通知,并触发相应的回调函数。该回调函数可以在子线程中执行,因此应该避免直接更新 UI 或执行其他需要在主线程中完成的操作。
需要注意的是,由于 FileObserver 基于 inotify 机制,因此在某些情况下,它可能无法捕获到所有文件系统事件。例如,在某些 Android 版本中,该类可能无法正确地处理外部存储器上的文件变化。此外,如果您同时监视多个文件或目录,请谨慎考虑性能和资源消耗问题。每个 FileObserver 对象都会创建一个新线程,并占用一定的 CPU 和内存资源。
简单实现demo
Android中实现的简单代码如下
- 文件监听器
package com.kaikai.test.application;
import android.os.Environment;
import android.os.FileObserver;
import android.util.Log;
import java.io.File;
public class MyFileObserver extends FileObserver {
private static final String TAG = "kai-debug";
private String mPath;
public static final String PATH= Environment.getExternalStorageDirectory() + File.separator + "my-file/";
public static final String TEST_FILE_NAME = "test2.txt";
private static MyFileObserver instance = new MyFileObserver(PATH);
public static void startWatchingFile() {
Log.e(TAG," startWatchingFile " + PATH);
instance.startWatching();
}
public static void stopWatchingFile()