`
天空之城
  • 浏览: 408119 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java听文件目录的变化

    博客分类:
  • Java
阅读更多

 

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
 * 监听文件目录的变化
 * @author liupengchao
 *
 */
public class DirMonitor implements Runnable {

	/**
     * just for test
     *
     * @param args
     */
    public static void main(String[] args) {
        DirMonitor dirMonitor = new DirMonitor("C:\\lpc", 1);
        dirMonitor.run();
    }

    /**
     * 监控的文件路径
     */
    private String dir;

    /**
     * 原有文件信息
     */
    private Map<String, String> oldDirFileMap;

    /**
     * 扫描间隔时间以秒为单位
     */
    private int period;

    /**
     * 初始化相关数据
     */
    public DirMonitor(String dir, int period) {
        this.dir = dir;
        this.period = period;
        this.oldDirFileMap = new HashMap<String, String>();
    }

    /**
     * 展示原有文件
     */
    private void displayNowFile() {
        System.out.println(dir + "路径原有文件目录如下:\n");
        Set set = oldDirFileMap.keySet();
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(oldDirFileMap.get(iterator.next()));
        }
        System.out.println("========================================");
    }

    /**
     * 得到增加的文件及文件夹,并增加到已有的文件信息中
     */
    private void getAddedFile(Map<String, String> nowDirFileMap) {
        for (Iterator<String> iterator = nowDirFileMap.keySet().iterator(); iterator.hasNext();) {
            String key = iterator.next();
            if (null == oldDirFileMap.get(key)) {
                oldDirFileMap.put(key, nowDirFileMap.get(key));
                System.out.println("新增" + nowDirFileMap.get(key)+"---"+key);
                File file = new File(nowDirFileMap.get(key));
                Reader reader = null;
                try {
                    System.out.println("读取的文件内容:");
                    // 一次读一个字符
                    reader = new InputStreamReader(new FileInputStream(file));
                    int tempchar;
                    while ((tempchar = reader.read()) != -1) {
                        // 对于windows下,\r\n这两个字符在一起时,表示一个换行。
                        // 但如果这两个字符分开显示时,会换两次行。
                        // 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
                        if (((char) tempchar) != '\r') {
                            System.out.print((char) tempchar);
                        }
                    }
                    reader.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 得到删除的文件及文件夹,并删除已经不存在的文件信息
     */
    private void getDeletedFile(Map<String, String> nowDirFileMap) {
        for (Iterator<String> iterator = oldDirFileMap.keySet().iterator(); iterator.hasNext();) {
            String key = iterator.next();
            if (null == nowDirFileMap.get(key)) {
                System.out.println("删除" + oldDirFileMap.get(key));
                iterator.remove();
                oldDirFileMap.remove(key);
            }
        }
    }

    /**
     * 线程的执行。对于修改文件的情况,则视为删除与增加两个操作。
     */
    public void run() {

        boolean isError = false;
        File file = new File(dir);
        // 初始化开始监控时的文件路径状态
        totalScan(file, oldDirFileMap);
        // 展示原有路径下的文件信息
        displayNowFile();
        while (!isError) {
            try {
                Thread.sleep(period * 1000);
                // 指定时间间间隔后扫描路径
                Map<String, String> nowDirFileMap = new HashMap<String, String>();
                totalScan(file, nowDirFileMap);
                // 得到删除的文件及文件夹
                 getDeletedFile(nowDirFileMap);
                // 得到新增的文件及文件夹
                getAddedFile(nowDirFileMap);
                // 注意:由于涉及到修改,所以一定要先检测删除的文件,然后再检测新增加的文件
            }
            catch (InterruptedException e) {
                System.out.println("对指定的文件路径进行监控时产生异常,异常信息为:" + e.getMessage());
                isError = true;
            }
        }
    }

    /**
     * 递归扫描整个路径
     *
     * @param dir
     * @param ndir
     * @param dirFileMap
     *            存放扫描结果
     */
    private void totalScan(File file, Map<String, String> dirFileMap) {

        String[] fileList = file.list();
        // 判断是否为空目录
        if (null != fileList) {
            for (int i = 0; i < fileList.length; i++) {
                String pname =file.getAbsolutePath() + "\\" + fileList[i];
              //  System.out.println("pname------->"+pname);
                File tempFile = new File(pname);
                if (tempFile.isDirectory()) {
                    dirFileMap.put(pname,pname);
                    totalScan(tempFile, dirFileMap);
                } else {
                    // 不相同的文件夹下,存放的文件可能名字相同,但是同一路径下的文件肯定不会相同,
                    // 所以采用全路径做为key值
                    dirFileMap.put(pname, pname);
                }
            }
        }
    }
}
 
分享到:
评论

相关推荐

    Java实现实时监控目录下文件变化的方法

    Java实现实时监控目录下文件变化的方法 Java实现实时监控目录下文件变化的方法是指通过Java语言来实现实时监控目录下文件的变化情况,包括文件的创建、删除、修改等操作。这种方法可以应用于各种场景,例如文件系统...

    java 监听本地文件自动上传服务器

    一旦检测到文件变化,你可以执行相应的处理逻辑,例如将新创建或修改的文件上传到服务器。 接下来,我们讨论“模拟POST提交文件流同步服务器文件”。在Java中,可以使用`java.net.HttpURLConnection`或第三方库如...

    java监测文件变化

    在Java编程中,监测文件变化是一项重要的功能,特别是在开发日志系统、自动化构建工具或实时数据处理应用时。本文将详细讲解如何使用Java实现文件变化的监控,并通过一个具体的示例来阐述相关知识点。 首先,Java中...

    java编写的ftp文件实时监控下载上传

    用java语言编写的ftp小工具,可以按指定时间监控ftp服务器,把服务器指定目录内新产生的文件或者文件夹下载到本地指定文件夹,下载后删除数据。 也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到...

    监听文件下文件发生变化时复制文件到另一个文件夹

    在IT领域,尤其是在系统管理和自动化任务执行中,有时我们需要实时监控某个目录下的文件变化,并在文件发生变动时执行特定操作,如复制文件到其他位置。这个场景可以通过编程实现,常用的编程语言如Python、Java或C#...

    Java利用WatchService监听文件变化示例

    本文将通过一个示例介绍如何使用Java的WatchService来监听文件变化。 首先,需要注意的是,WatchService仅能对目录进行监视,而不能对文件进行监视。在开始编写代码之前,我们需要确定一个目录的路径来作为监听的...

    java读取项目中的文件(src目录下)

    在Java编程中,读取项目中的文件,特别是位于`src`目录下的文件,是一个常见的需求。这涉及到对项目结构的理解和使用Java I/O流的知识。`src`目录通常包含源代码文件,而运行时,这些文件会被编译并放置到类路径...

    Java写的简单文件目录监控程序

    标题 "Java写的简单文件目录监控程序" 涉及到的是使用Java编程语言实现一个能够监控文件目录变化的工具。这种程序通常用于自动化任务,比如当文件或目录发生变化时自动执行某些操作,如备份、同步或者日志记录。在...

    监视指定文件的变化.rar

    除了编程实现外,还有一些图形界面工具和命令行工具可以用于文件变化监控,比如`fswatch`(跨平台)、`tail`命令的 `-f`选项(实时追踪文件追加内容)等。 六、应用场景 1. 日志分析:实时查看日志文件的新增内容,...

    spring boot文件夹文件监听程序

    总的来说,"spring boot文件夹文件监听程序"是一个结合了Java文件系统监听和Spring Boot自动化功能的实用工具,它可以实时监控指定目录,及时响应文件变化,对于文件管理、数据同步等场景具有很高的价值。...

    java android 文件监听器

    在Android平台上,开发Java应用程序时,我们经常需要处理与文件系统相关的任务,其中之一就是实现文件监听器。这个功能允许我们实时监控一个特定的文件夹,一旦该文件夹中有新的文件出现,程序可以立即做出响应,...

    eclipse插件,打开java文件目录

    在本话题中,我们将深入探讨“eclipse插件,打开java文件目录”这一主题。 首先,了解Eclipse插件的基本概念。Eclipse作为一个开放平台,其核心架构允许开发者创建和集成自定义工具,这些工具就是我们所说的插件。...

    java文件监控例子

    Java文件监控是一个重要的功能,它允许程序实时检测文件或目录的改变,如创建、修改、删除等事件。在Java中实现文件监控,可以利用JNotify库,这是一个强大的文件系统变动通知库,支持Windows、Linux和Mac OS X操作...

    Java目录监视器源程序

    Java目录监视器是一个基于Java编程语言实现的小型实用工具,其主要功能是实时监控指定的文件目录,并在每次扫描间隔(如5秒)后报告目录内文件大小的变化以及文件数量的增减。这个应用程序对于开发者来说非常有用,...

    Java 7文件操作

    - Java 7引入了`java.nio.file.FileSystemObserver`接口,可以监听文件系统的变化,如文件创建、删除、移动等事件。 6. **路径操作**: - `getParent()`和`getName()`方法用于获取路径的父路径和最后一个元素。 ...

    java实现windows文件系统操作监控

    在Java编程环境中,实现Windows文件系统的操作监控是一个有趣且实用的技术挑战。这涉及到对系统底层事件的捕获,通常需要借助于系统钩子(System Hooks)的概念。在Java中,虽然原生支持并不完善,但我们可以通过...

    Java文件同步开源项目Sync

    【Java文件同步开源项目Sync】是一个基于Java语言开发的实用工具,主要目的是提供高效、可靠的文件和目录同步功能。这个开源项目为开发者提供了一个简单易用的命令行接口,允许用户方便地对本地或远程文件系统进行...

    java源码 java 获取文件md5值(用于检测文件完整性) 2018127

    在提供的文件列表中,`FileMd5Demo.iml`是IntelliJ IDEA项目文件,`.idea`目录包含项目配置信息,`src`目录通常存放源代码,而`out`目录则是编译后的输出目录。如果你在项目中找到了名为`FileMd5Demo.java`的源文件...

    java 使用线程监控文件目录变化的实现方法

    Java 使用线程监控文件目录变化的实现方法 Java 使用线程监控文件目录变化的实现方法是指通过 Java 语言实现对文件目录的实时监控,以便及时检测文件的变化情况。本文将详细介绍 Java 使用线程监控文件目录变化的...

    JAVA监听目录改变

    在Java编程中,有时我们需要监控某个目录的变化,例如文件的添加、删除或修改。这个功能在文件上传、日志监控、实时数据处理等场景中非常有用。`JAVA 监听目录改变`是一个实用的技术,它涉及到Java的I/O操作和事件...

Global site tag (gtag.js) - Google Analytics