`
eimhee
  • 浏览: 2167808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA文件监视开发技术

    博客分类:
  • JAVA
阅读更多
最近在用java写监视文件系统的东东 Java下的实现方法做一小结。

Java环境下

很多人都说用文件轮询HashTable,然后如何如何比较,这种方法效率极为低下,还会造成无谓的磁盘读写。好了JDK 7中提供了java.nio.file大家可以通过 WatchService 来实现对文件的事件的监听。千万记得在JDK 7下哈,现在的JDK7的预览版发布到 jdk-7-ea-bin-b84-windows-i586-18_feb_2010.exe了。有兴趣的哥们可以把这个程序拿下去学习学习。
该段代码来自于 Sun(准确的该说是Oracle了) http://java.sun.com/docs/books/tutorial/essential/io/notification.html

/*
 * Copyright 2008-2009 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*;
import static java.nio.file.LinkOption.*;
import java.nio.file.attribute.*;
import java.io.*;
import java.util.*;

/**
 * Example to watch a directory (or tree) for changes to files.
 */

public class WatchDir {

    private final WatchService watcher;
    private final Map<WatchKey,Path> keys;
    private final boolean recursive;
    private boolean trace = false;

    @SuppressWarnings("unchecked")
    static <T> WatchEvent<T> cast(WatchEvent<?> event) {
        return (WatchEvent<T>)event;
    }

    /**
     * Register the given directory with the WatchService
     */
    private void register(Path dir) throws IOException {
        WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
        if (trace) {
            FileRef prev = keys.get(key);
            if (prev == null) {
                System.out.format("register: %s\n", dir);
            } else {
                if (!dir.equals(prev)) {
                    System.out.format("update: %s -> %s\n", prev, dir);
                }
            }
        }
        keys.put(key, dir);
    }

    /**
     * Register the given directory, and all its sub-directories, with the
     * WatchService.
     */
    private void registerAll(final Path start) throws IOException {
        // register directory and sub-directories
        Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir) {
                try {
                    register(dir);
                } catch (IOException x) {
                    throw new IOError(x);
                }
                return FileVisitResult.CONTINUE;
            }
        });
    }

    /**
     * Creates a WatchService and registers the given directory
     */
    WatchDir(Path dir, boolean recursive) throws IOException {
        this.watcher = FileSystems.getDefault().newWatchService();
        this.keys = new HashMap<WatchKey,Path>();
        this.recursive = recursive;

        if (recursive) {
            System.out.format("Scanning %s ...\n", dir);
            registerAll(dir);
            System.out.println("Done.");
        } else {
            register(dir);
        }

        // enable trace after initial registration
        this.trace = true;
    }

    /**
     * Process all events for keys queued to the watcher
     */
    void processEvents() {
        for (;;) {

            // wait for key to be signalled
            WatchKey key;
            try {
                key = watcher.take();
            } catch (InterruptedException x) {
                return;
            }

            Path dir = keys.get(key);
            if (dir == null) {
                System.err.println("WatchKey not recognized!!");
                continue;
            }

            for (WatchEvent<?> event: key.pollEvents()) {
                WatchEvent.Kind kind = event.kind();

                // TBD - provide example of how OVERFLOW event is handled
                if (kind == OVERFLOW) {
                    continue;
                }

                // Context for directory entry event is the file name of entry
                WatchEvent<Path> ev = cast(event);
                Path name = ev.context();
                Path child = dir.resolve(name);

                // print out event
                System.out.format("%s: %s\n", event.kind().name(), child);

                // if directory is created, and watching recursively, then
                // register it and its sub-directories
                if (recursive && (kind == ENTRY_CREATE)) {
                    try {
                        if (Attributes.readBasicFileAttributes(child, NOFOLLOW_LINKS).isDirectory()) {
                            registerAll(child);
                        }
                    } catch (IOException x) {
                        // ignore to keep sample readbale
                    }
                }
            }

            // reset key and remove from set if directory no longer accessible
            boolean valid = key.reset();
            if (!valid) {
                keys.remove(key);

                // all directories are inaccessible
                if (keys.isEmpty()) {
                    break;
                }
            }
        }
    }

    static void usage() {
        System.err.println("usage: java WatchDir [-r] dir");
        System.exit(-1);
    }

    public static void main(String[] args) throws IOException {
        // parse arguments
        if (args.length == 0 || args.length > 2)
            usage();
        boolean recursive = false;
        int dirArg = 0;
        if (args[0].equals("-r")) {
            if (args.length < 2)
                usage();
            recursive = true;
            dirArg++;
        }

        // register directory and process its events
        Path dir = Paths.get(args[dirArg]);
        new WatchDir(dir, recursive).processEvents();
    }
}


JAVA是借助统级的事件通知来完成对文件系统的监视的,性能上自然很强了。
5
4
分享到:
评论
2 楼 freej 2010-03-09  
不错,早该有这功能了。
1 楼 Extjs3 2010-03-09  
以前看过C语言写的, 比这个复杂多了

相关推荐

    JAVA视频监视系统

    2 Java项目文件构成 由一个servlet构成,用来存储异常录像的发生时间和录像名称。类文件叫做RecordServlet.java。 运行步骤: 1 设置odbc数据源,利用附件提供的数据库,数据源名称为:record 在FlashMediaServer...

    Java内存监视器.rar

    5. **第三方库**:如HProf,它是一个Java内存分析工具,能够生成堆转储文件供后续分析。 在实际开发中,我们不仅要关注内存的分配和使用,还需要关注内存泄漏问题。内存泄漏可能导致程序性能下降,甚至导致系统崩溃...

    文件监视,监视对文件的复制删除移动等操作

    8. **编程语言支持**:开发文件监视应用可能涉及到C++、C#、Java等编程语言,对于Windows平台,尤其是需要编写驱动程序时,通常会使用C++配合Windows Driver Kit(WDK)。 总的来说,文件监视是一个涉及操作系统...

    Java自动监视usb设备,

    总的来说,实现"Java自动监视usb设备,复制存储设备中指定格式文件到本地"的功能,需要深入了解Java的USB API、文件I/O操作、并发编程和错误处理等技术。在实际开发中,可以根据具体需求进行优化和定制,例如添加日志...

    java开发的管理文件系统

    9. 文件监控:通过`java.nio.file.FileSystem`和`java.nio.file.FileSystems`类,可以注册监听器监视文件系统事件,如文件创建、删除、修改等。 10. ZIP和RAR等压缩格式的支持:Java标准库并不直接支持ZIP或RAR格式...

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

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

    本机文件目录监视的资源

    在IT领域,对本机文件目录进行监视是一项重要的任务,特别是在系统管理、软件开发和数据监控等场景。文件目录监视允许我们实时跟踪目录中的变化,例如文件的创建、删除、移动或修改,这对于自动化流程、日志管理和...

    文件拖放打开和文件监视

    在IT领域,文件拖放和文件监视是两个重要的功能,它们极大地提升了用户在操作系统中的交互体验和工作效率。这里,我们将详细探讨这两个概念及其在实际应用中的实现。 首先,"文件拖放打开"是指用户可以通过鼠标将一...

    java实现监视任务的进度条

    ### Java 实现监视任务的进度条 #### 背景介绍 在开发用户界面或执行长时间运行的任务时,提供一个可视化的进度指示器对于提升用户体验至关重要。进度条是一种常见的控件,用于显示任务的完成情况。Java 提供了...

    Java目录监视器项目源程序

    总结,Java目录监视器项目源程序是Java技术在文件系统监控领域的一个实际应用,它结合了Java NIO的`WatchService`接口,为开发者提供了一种高效、灵活的方式来跟踪和响应文件系统变化。通过学习和应用这个项目,不仅...

    java的文件

    以下是一些相关的Java文件操作知识点: 1. **文件I/O流**:Java提供了丰富的I/O流类库,如FileInputStream和FileOutputStream用于读写文件。通过创建这些对象,我们可以对文件进行读取或写入操作。例如,`new ...

    java屏幕监视的两个小程序.rar

    标题中的“java屏幕监视的两个小程序.rar”表明这是一个关于Java编程的压缩文件,其中包含了用于屏幕监视的小程序。这些小程序可能被设计用于调试目的,帮助开发者观察和理解应用程序在运行时的行为。 首先,我们来...

    Java目录监视器源程序.zip

    Java目录监视器是一种实用工具,它能够实时监控指定目录下的文件和子目录的变化,例如文件的创建、修改、删除等事件。这样的功能在开发、测试和调试过程中非常有用,可以帮助开发者跟踪代码变动或者数据文件的更新。...

    java窗口应用程序布局与监视器

    【Java窗口应用程序布局与监视器】是Java编程中关于图形用户界面GUI开发的重要知识点。在Java中,我们通常使用AWT或Swing库来创建窗口应用程序。在这个例子中,我们看到一个名为`Window`的类扩展了`Frame`类,并实现...

    f_java_开发辅助_辅助开发工具_开发辅助工具_android_

    在文件名称列表中,"pandora-master"可能是指Pandora项目,这是一个开源的Android开发辅助框架。Pandora通常包含一系列模块,如日志管理、网络监控、性能统计等,旨在为开发者提供全方位的开发支持。 Pandora的核心...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    监视指定文件的变化.rar

    在IT领域,监视指定文件的变化是一项重要的任务,特别是在系统监控、日志分析、软件调试以及自动化脚本编写等场景中。这项技术可以帮助我们实时...无论是开发、运维还是数据分析,了解和掌握这一技术都是非常有价值的。

    java开发文档API

    JDK是Java的基础,它包含了Java运行时环境(JRE)、编译器(javac)、Javadoc工具(用于生成API文档)以及一系列的实用工具,如jar打包工具、jconsole性能监视器等。JDK的版本更新频繁,每次更新都会带来新的特性和...

    Java JDK是Java开发工具包(Java Development Kit)的缩写,是Java开发的核心组件之一

    1. **Java编译器(javac)**:这是JDK中的核心组件之一,它负责将程序员编写的源代码(.java文件)转换成Java字节码(.class文件),这个过程叫做编译。Java字节码是一种平台无关的中间表示,可以在任何安装了JVM的...

Global site tag (gtag.js) - Google Analytics