iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android如何监测文件夹内容变化详解
  • 109
分享到

Android如何监测文件夹内容变化详解

2024-04-02 19:04:59 109人浏览 薄情痞子
摘要

目录一. 概述:二. 监听的事件类型:三.实例总结一. 概述: Android.os包下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于

一. 概述:

Android.os包下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于linux的INotify。FileObserver是个抽象类,必须继承它才能使用。每个FileObserver对象监听一个单独的文件或者文件夹,如果监视的是一个文件夹,那么文件夹下所有的文件和级联子目录的改变都会触发监听的事件。

FileObserver简介Android.os包下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于Linux的INotify。

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,包括上面的所有事件

三.实例


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;  
      
      
    @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(); //开始监听  
        }  
    }  
  
    public void onDestory() {  
        if(null != mFileObserver) mFileObserver.stopWatching(); //停止监听  
    }  
      
    static class SDCardFileObserver extends FileObserver {  
        //mask:指定要监听的事件类型,默认为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: 文件或目录被创建, path: " + path);  
                break;  
            }  
        }  
          
    }  
}  

onEvent是回调,系统监听到事件后会触发此事件,参数event就是上面所说的事件类型,参数path就是触发事件的目录,鉴定只针对于该层目录,其他层次无效。

我们大多数需要监听path目录下的所有文件对象的相关操作,那该如何是好呢?解决问题方法之一就是重新实现FileObserver类,

下面是对FileObserver类的重写实现过程


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 {   
   
      
    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;   
        }   
    }   
   
       
    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);   
        }   
    }   
}

总结

到此这篇关于Android如何监测文件夹内容变化的文章就介绍到这了,更多相关Android监测文件夹内容内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android如何监测文件夹内容变化详解

本文链接: https://www.lsjlt.com/news/159693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android如何监测文件夹内容变化详解
    目录一. 概述:二. 监听的事件类型:三.实例总结一. 概述: android.os包下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于...
    99+
    2024-04-02
  • Android怎么监测文件夹内容变化
    本篇内容主要讲解“Android怎么监测文件夹内容变化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么监测文件夹内容变化”吧!一. 概述:android.os包下的FileObs...
    99+
    2023-06-25
  • Python监控文件内容变化
    利用seek监控文件内容,并打印出变化内容:#/usr/bin/env python #-*- coding=utf-8 -*- pos = 0 while True:     con = open("a.txt")   if pos !...
    99+
    2023-01-31
    文件 内容 Python
  • 详解Vue如何监测数组的变化
    目录一、使用 Vue.js 提供的方法来更新数组二、使用专门用于监测数组变化的语法糖三、使用Vue.observable()函数四、使用 computed 属性和 watch 属性监...
    99+
    2023-01-28
    Vue监测数组变化 Vue 数组变化 Vue 数组
  • 如何监听mysql表内容变化
    这篇文章主要为大家展示了“如何监听mysql表内容变化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何监听mysql表内容变化”这篇文章吧。前言binlog ...
    99+
    2024-04-02
  • 如何监控Linux文件变化
    这篇文章主要介绍了如何监控Linux文件变化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述在*nix体系一切皆文件,系统文件的变化往往反应着系统的变化,比如系统应用的更新...
    99+
    2023-06-16
  • 怎么在Java中使用WatchService监控文件内容变化
    这篇文章将为大家详细讲解有关怎么在Java中使用WatchService监控文件内容变化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现方案自己起一个单独线程,定时加载文件,实现较简单,但...
    99+
    2023-05-30
    java watchservice
  • 如何用Shell监控文件变化
    这篇文章主要讲解了“如何用Shell监控文件变化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用Shell监控文件变化”吧!文件监控可以配合rsync实现文件自动同步,例如监听某个目录,...
    99+
    2023-06-15
  • java如何监听文件变化并读取文件
    Java中可以使用java.nio.file包中的WatchService类来监听文件的变化,并使用BufferedReader类来...
    99+
    2023-09-26
    java
  • FileZilla如何实现文件夹内容比较
    这篇文章给大家分享的是有关FileZilla如何实现文件夹内容比较的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。FileZilla文件夹内容比较文件夹内容比较就是对两台不同的机器上的相关目录下的内容进行比较,然后...
    99+
    2023-06-16
  • SpringBoot如何监听redis Key变化事件案例详解
    目录一 、功能概览二、事件类型三、配置三、案例代码新增和修改都是set指令删除过期总结键空间通知(keyspace notification) 一 、功能概览 键空间通知使得客户端可...
    99+
    2022-11-13
    springboot监听redis key变化 springboot监听redis过期key
  • 如何删除临时Internet文件文件夹中的内容
    要删除临时Internet文件夹中的内容,请按照以下步骤进行操作:1. 首先,打开文件资源管理器。可以通过按下Win + E组合键或...
    99+
    2023-09-08
    Internet
  • Java实现监听文件变化的三种方案详解
    目录背景方案一:定时任务 + File#lastModified方案二:WatchService方案三:Apache Commons-IO小结背景 在研究规则引擎时,如果规则以文件的...
    99+
    2024-04-02
  • php如何删除文件夹及其所有内容
    本篇内容介绍了“php如何删除文件夹及其所有内容”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在 PHP 中删除文件和文件夹是很简单的,但如...
    99+
    2023-07-05
  • 详解如何取消Git文件夹
    在软件开发中,版本控制是一项十分重要的工作。而Git作为目前最流行的版本控制工具,可以帮助我们轻松地追踪代码的变化,并且在多人协作时能够保证代码的一致性。但是有时候我们会遇到一些问题,比如Git文件夹的大小会不断增加,占用磁盘空间,影响机器...
    99+
    2023-10-22
  • android文件夹无法删除如何解决
    如果您的Android手机或平板电脑中的文件夹无法删除,您可以尝试以下解决方法: 重启设备:有时候,重启设备可以解决一些临时问题...
    99+
    2023-10-25
    android
  • Android编辑框EditText与焦点变更监视器及文本变化监视器实现流程详解
    目录一、编辑框EditText二、焦点变更监视器三、文本变化监听器一、编辑框EditText 编辑框用于接收键盘输入的文字,由文本视图派生而来,除了TextView已有的各种属性和方...
    99+
    2024-04-02
  • win7文件夹变绿没权限如何解决
    这篇文章主要介绍了win7文件夹变绿没权限如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7文件夹变绿没权限如何解决文章都会有所收获,下面我们一起来看看吧。win7文件夹变绿没权限解决方法首先右键选...
    99+
    2023-07-01
  • github中如何只下载一个文件夹中的内容
    这篇文章主要讲解了“github中如何只下载一个文件夹中的内容”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“github中如何只下载一个文件夹中的内容”吧!步骤一:打开GitHub存储库首先...
    99+
    2023-07-05
  • vue中如何实现组件内监控$store中定义变量的变化
    这篇文章将为大家详细讲解有关vue中如何实现组件内监控$store中定义变量的变化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。// 1.采用计算属性来获取$store中...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作