文件系统监控利器:Java NIO WatchService深度解析与实践指南

Java IO流与File类实战:从基础到高级应用 Java IO流是处理输入输出操作的核心技术,基于字节流和字符流实现数据传输。其底层采用装饰器模式设计,通过组合不同流类实现功能扩展。在文件处理场景中,File类作为文件系统的抽象表示,提供了跨平台路径处理和元数据操作能力。合理使用缓冲策略和内存映射技术可以显著提升IO性能,特别是在处理大文件时。本文深入解析File类的设计原理与字节流实战技巧,涵盖文件锁、内存映射等高级应用,帮助开发者规避常见路径问题和性能陷阱。 阅读详情

最近有个需求需要读取目录下的报文进行解析入库,而目录下的报文是不定时写入的,那就需要不断监控目录。java nio 中的WatchService可以实现这个需求,于是对WatchService研究了一番,本文就来详细记录下学习WatchService 的过程。

什么是WatchService

/**
 * A watch service that <em>watches</em> registered objects for changes and
 * events. For example a file manager may use a watch service to monitor a
 * directory for changes so that it can update its display of the list of files
 * when files are created or deleted.
 */

一个监视服务,用于监视已注册对象的更改和事件。例如,文件管理器可以使用监视服务来监视目录的更改,以便在创建或删除文件时更新其文件列表显示。

/* <p> A {@link Watchable} object is registered with a watch service by invoking
* its {@link Watchable#register register} method, returning a {@link WatchKey}
* to represent the registration. When an event for an object is detected the
* key is <em>signalled</em>, and if not currently signalled, it is queued to
* the watch service so that it can be retrieved by consumers that invoke the
* {@link #poll() poll} or {@link #take() take} methods to retrieve keys
* and process events. Once the events have been processed the consumer
* invokes the key's {@link WatchKey#reset reset} method to reset the key which
* allows the key to be signalled and re-queued with further events.
*/

注册与取消监控服务

通过调用Watchable对象的Watchable#register register方法,可以将该对象注册到监视服务,返回一个 WatchKey来表示该注册。当检测到对象的事件时,该键将被标记,如果当前未被标记,则将其排队到监视服务,以便调用监控服务的poll() 或 take() 方法的消费者可以检索键并处理事件。处理完事件后,消费者调用键的 WatchKey#reset 方法来重置键,这允许该键被标记并使用进一步的事件重新排队。

/* <p> Registration with a watch service is cancelled by invoking the key's
* {@link WatchKey#cancel cancel} method. A key that is queued at the time that
* it is cancelled remains in the queue until it is retrieved. Depending on the
* object, a key may be cancelled automatically. For example, suppose a
* directory is watched and the watch service detects that it has been deleted
* or its file system is no longer accessible. When a key is cancelled in this
* manner it is signalled and queued, if not currently signalled. To ensure
* that the consumer is notified the return value from the {@code reset}
* method indicates if the key is valid.
*/

通过调用键的WatchKey#cancel 方法可以取消在监视服务中的注册。在取消时已排队的键将保留在队列中,直到被检索为止。根据对象的不同,键可能会自动取消。例如,假设监视了一个目录,并且监视服务检测到该目录已被删除或其文件系统不再可访问。当以这种方式取消键时,如果当前未被标记,则将其标记并排队。为确保消费者收到通知,reset方法的返回值指示该键是否有效。

多线程使用监控服务

/* <p> A watch service is safe for use by multiple concurrent consumers. To
* ensure that only one consumer processes the events for a particular object at
* any time then care should be taken to ensure that the key's {@code reset}
* method is only invoked after its events have been processed. The {@link
* #close close} method may be invoked at any time to close the service causing
* any threads waiting to retrieve keys, to throw {@code
* ClosedWatchServiceException}.
*/

监视服务可供多个并发消费者安全使用。为确保在任何时候只有一个消费者处理特定对象的事件,
应注意确保仅在处理完其事件后才调用键的reset方法。close 方法可以随时调用以关闭服务,导致任何等待检索键的线程抛出ClosedWatchServiceException。

/* <p> File systems may report events faster than they can be retrieved or
* processed and an implementation may impose an unspecified limit on the number
* of events that it may accumulate. Where an implementation <em>knowingly</em>
* discards events then it arranges for the key's {@link WatchKey#pollEvents
* pollEvents} method to return an element with an event type of {@link
* StandardWatchEventKinds#OVERFLOW OVERFLOW}. This event can be used by the
* consumer as a trigger to re-examine the state of the object.
*/

文件系统报告事件的速度可能快于它们被检索或处理的速度,实现可能会对其可能累积的事件数量施加未指定的限制。当实现明知丢弃事件时,它会安排键的 WatchKey#pollEvents方法返回一个事件类型为StandardWatchEventKinds#OVERFLOW 的元素。消费者可以将此事件用作重新检查对象状态的触发器。

/* <p> When an event is reported to indicate that a file in a watched directory
* has been modified then there is no guarantee that the program (or programs)
* that have modified the file have completed. Care should be taken to coordinate
* access with other programs that may be updating the file.
* The {@link java.nio.channels.FileChannel FileChannel} class defines methods
* to lock regions of a file against access by other programs.
*/

当报告事件表明被监视目录中的文件已被修改时,无法保证修改该文件的程序已完成。应注意与可能正在更新该文件的其他程序协调访问。 java.nio.channels.FileChannel FileChannel类定义了锁定文件区域以防止其他程序访问的方法。

平台依赖性

/* <h2>Platform dependencies</h2>
*
* <p> The implementation that observes events from the file system is intended
* to map directly on to the native file event notification facility where
* available, or to use a primitive mechanism, such as polling, when a native
* facility is not available. Consequently, many of the details on how events
* are detected, their timeliness, and whether their ordering is preserved are
* highly implementation specific. For example, when a file in a watched
* directory is modified then it may result in a single {@link
* StandardWatchEventKinds#ENTRY_MODIFY ENTRY_MODIFY} event in some
* implementations but several events in other implementations. Short-lived
* files (meaning files that are deleted very quickly after they are created)
* may not be detected by primitive implementations that periodically poll the
* file system to detect changes.
*
* <p> If a watched file is not located on a local storage device then it is
* implementation specific if changes to the file can be detected. In particular,
* it is not required that changes to files carried out on remote systems be
* detected.
*/

观察文件系统事件的实现旨在直接映射到本机文件事件通知设施(如果可用),或者在本机设施不可用时使用原始机制(如轮询)。因此,关于如何检测事件、事件的及时性以及是否保持事件顺序的许多细节是高度特定于实现的。例如,当被监视目录中的文件被修改时,在某些实现中可能导致单个
StandardWatchEventKinds#ENTRY_MODIFY 事件,但在其他实现中可能导致多个事件。原始实现通过定期轮询文件系统来检测更改,可能无法检测到短暂存在的文件(指创建后很快被删除的文件)。

如果被监视的文件不在本地存储设备上,则是否可以检测到对该文件的更改是特定于实现的。
特别是,不要求检测在远程系统上对文件进行的更改。

WatchService API使用流程

创建WatchService实例

在这里插入图片描述

从源码可以看出,WatchService是一个接口,只有四个方法,那么怎么创建WatchService对象?创建WatchService对象需通过调用 java.nio.file.FileSystem 类的 newWatchService() 方法来实现。

WatchService watchService = FileSystems.getDefault().newWatchService();

在上述中,监控服务的注册需要调用Watchable对象的Watchable#register register方法。Watchable 是 Java NIO 文件系统中用于表示可以被监视的对象的核心接口。它允许将对象注册到监视服务中,以便检测文件系统的变化和事件。
在这里插入图片描述
java.nio中Watchable接口的继承者只有java.nio.file.Path接口,所以我们需要通过该接口的 register方法来注册监控服务。该接口是 Java 7 中引入的用于替代传统 java.io.File 类的现代文件路径操作接口‌
,它提供了更强大、更灵活的文件系统操作能力。具备跨操作系统,自动处理不同系统的路径差异‌;表示文件或目录的绝对路径和相对路径;支持多线程并行使用等特性。通过传入指定路径创建Path对象。

// 创建Path对象
Path watchDirectory = Paths.get(directoryPath);
// 注册监控事件:文件创建
watchDirectory.register(watchService,StandardWatchEventKinds.ENTRY_CREATE);

StandardWatchEventKinds是一个定义了标准事件类型的工具类,包括以下几种核心事件类型:

  • ENTRY_CREATE‌ - 目录条目创建
  • ENTRY_DELETE‌ - 目录条目删除
  • ENTRY_MODIFY‌ - 目录条目修改
  • OVERFLOW‌ - 表示事件可能丢失或丢弃的特殊事件

获取事件

在某个目录上创建并注册了监控服务之后,接下来就是通过监控服务获取目录的事件了,可以调用 poll() 或 take() 方法获取事件。两者主要区别是 poll() 方法立即返回结果,如果没有事件就返回 null; take() 方法如果没有事件,会一直等待直到有事件发生。

WatchKey key = watchService.poll(100, TimeUnit.MILLISECONDS);

WatchKey是WatchService 的核心组件,代表在监视服务中的一个注册,用于跟踪文件系统对象的变化。每个向 WatchService 注册的目录都会返回一个 WatchKey 实例,该实例负责跟踪该目录中发生的事件。关键方法:

  • pollEvents()‌:检索并移除所有待处理的事件,返回一个包含所有捕获事件的列表。
  • reset()‌:重置键值,使其重新处于就绪状态,继续等待后续事件。
  • isValid()‌:检查该键值是否仍然有效,在某些情况下(如目录被删除),键值会自动失效。
if (key != null) {  // 如果有关键事件发生
    for (WatchEvent<?> event : key.pollEvents()) {  // 遍历所有事件
        // 检查事件类型是否为文件创建
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
            // 解析事件上下文,获取新创建文件的路径
            Path filePath = watchDirectory.resolve((Path) event.context());
            // ...
        }
    }
    // 重置监控键,使其能够继续接收新事件
    key.reset();
}    

WatchKey 的pollEvents()返回一个事件列表List<WatchEvent<?>>,通过WatchEvent对象可以获取事件的类型、事件内容和事件数量。

/**
 * Returns the context for the event.
 *
 * <p> In the case of {@link StandardWatchEventKinds#ENTRY_CREATE ENTRY_CREATE},
 * {@link StandardWatchEventKinds#ENTRY_DELETE ENTRY_DELETE}, and {@link
 * StandardWatchEventKinds#ENTRY_MODIFY ENTRY_MODIFY} events the context is
 * a {@code Path} that is the {@link Path#relativize relative} path between
 * the directory registered with the watch service, and the entry that is
 * created, deleted, or modified.
 *
 * @return  the event context; may be {@code null}
 */
T context();

WatchEvent#context()方法返回事件的上下文信息。对于StandardWatchEventKinds#ENTRY_CREATE 、StandardWatchEventKinds#ENTRY_DELETE 和StandardWatchEventKinds#ENTRY_MODIFY 类型的事件,上下文是一个Path对象,表示在监视服务中注册的目录与所创建、删除或修改的条目之间的Path#relativize 相对路径。例如:

// 基础路径
Path watchDirectory = Paths.get("/home/user");

// 相对路径,创建文件事件返回的内容/order.xml
Path path = (Path) event.context();

// resolve()则将基础路径与相对路径进行拼接,得到/home/user/order.xml
Path filePath = watchDirectory.resolve(path);

监控目录举例

public class WatchServiceTest {
    public static void main(String[] args) throws IOException, InterruptedException {
        WatchService watchService = FileSystems.getDefault().newWatchService();
        String dir = "D:\\log";
        Path watchDir = Paths.get(dir);
        watchDir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
        while (true) {
            System.out.println("开始监控目录" + dir);
            WatchKey key = watchService.poll(1000, TimeUnit.MILLISECONDS);
            if (key != null) {
                key.pollEvents().forEach(event -> {
                    if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                        System.out.println("监控到文件创建事件:" + event.context());
                    } else if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                        System.out.println("监控到文件删除事件:" + event.context());
                    } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                        System.out.println("监控到文件删除修改:" + event.context());
                    }
                });
                key.reset();
            }
        }
    }
}

运行程序后,往目录中增删改文件,运行结果如下:

开始监控目录D:\log
开始监控目录D:\log
监控到文件创建事件:新建文本文档.txt
开始监控目录D:\log
开始监控目录D:\log
监控到文件删除事件:新建文本文档.txt
监控到文件创建事件:test.txt
开始监控目录D:\log
开始监控目录D:\log
开始监控目录D:\log
监控到文件创建事件:test - 副本.txt
开始监控目录D:\log
监控到文件删除修改:test - 副本.txt
开始监控目录D:\log
监控到文件创建事件:test - 副本 (2).txt
开始监控目录D:\log
监控到文件删除修改:test - 副本 (2).txt
开始监控目录D:\log
监控到文件创建事件:test - 副本 (3).txt
开始监控目录D:\log
监控到文件删除修改:test - 副本 (3).txt
开始监控目录D:\log
监控到文件创建事件:test - 副本 (4).txt
开始监控目录D:\log
监控到文件删除修改:test - 副本 (4).txt
开始监控目录D:\log
开始监控目录D:\log
开始监控目录D:\log
监控到文件删除事件:test - 副本 (4).txt
开始监控目录D:\log
监控到文件删除事件:test - 副本 (3).txt
开始监控目录D:\log
监控到文件删除修改:test.txt
开始监控目录D:\log
监控到文件删除修改:test.txt
开始监控目录D:\log

从运行结果可以验证,事件的返回内容是文件的相对路径。

Java Files类:NIO.2文件操作的核心原理与工程实践 Files类是Java 7引入的NIO.2标准文件操作抽象,它取代了老旧的File类,提供声明式、线程安全、异常精细化的路径操作能力。其底层基于Path语义化抽象与FileSystemProvider插件机制,支持本地磁盘、ZIP、HDFS乃至云存储等多文件系统统一编程。技术价值在于将‘如何操作文件’升维为‘我要做什么’,显著提升代码可读性、可测性与跨平台鲁棒性。典型应用场景包括日志轮转、ETL数据处理、容器化部署脚本及微服务缓存一致性校验。本文深入解析Files类的设计哲学、核心API陷阱及生产级避坑方案 阅读详情

相关推荐

Java技术变现新路径:基于JVM生态的工程化赚钱模型

Java作为一门成熟语言,其核心价值已从语法特性升维为JVM生态所承载的稳定性、向后兼容性与企业级信任背书。在等保合规、遗留系统现代化和垂直领域工具链等刚性需求驱动下,Java凭借字节码增强、Java Agent、ClassLoader热加载等原生能力,成为构建合规即服务(Compliance-as-a-Service)、遗留系统缝合层及微型SaaS的关键技术底座。它不追求性能极限,而以‘可审计、可验证、零改造集成’满足法务签字、运维背书与终端用户习惯三重决策节点。本文聚焦Java在2025年中小企业技术变

weixin_30378623的博客 405

NIO 之 WatchService

NIO 之 WatchService Java 1.6版本以前是不存在目录监控的API的。如果要实现这种功能必须要自己遍历目录,记录各个文件的情况,然后定时全部遍历一次,从 JDK7 之后出现了 WatchService 类,实现了对目录下文件的监控。 整体流程 整个监控目录文件操作的流程大致如下: 获取 WatchService 注册...

weixin_34220963的博客 347

Java编程:java.nio.file.WatchService 实时监控文件变化【并没有真正实时】

在平时的开发过程中,会有很多场景需要实时监听文件的变化,如下: 1、通过实时监控 mysql 的 binlog 日志实现数据同步 2、修改配置文件后,希望系统可以实时感知 3、应用系统将日志写入文件中,日志监控系统可以实时抓取日志,分析日志内容并进行报警 4、类似 ide 工具,可以实时感知管理的工程下的文件变更 在 Java 语言中,从 JDK7 开始,新增了java.nio.file.Watc...

天将降大任于是人 5585

Java NIO2 中的 WatchService 指南

它有一个干净的 API,并且针对性能进行了很好的优化,我们不需要实现自己的解决方案。观察程序服务最实际的应用需要一个循环,在这个循环中,我们不断检查监视目录中的更改并相应地进行处理。当我们注册一个目录时,它的实例由监视服务返回给我们,当我们询问监视服务是否发生了我们注册的任何事件时。API,以及它在内部的工作原理以及如何使用它,因此我们现在可以继续查看一个完整且实用的示例。出于可移植性的原因,我们将监视用户主目录中的活动,该目录应在所有现代操作系统上都可用。在此步骤之后,我们必须向监视服务注册路径。

allway2的博客 2313

AMCL代码详解(六)amcl中的重采样

每次都从w1左边的竖线开始转,显而易见,转到w1的概率为0-w1之间的随机数,转到w2的概率为w1到w1+w2之间的随机数,转到w3的概率为w1+w2到w1+w2+w3之间的随机数,后面的依次类推。当某个粒子的权值较大的时候,产生的随机数落在相应区间的概率就会增大,从而实现了对权值大粒子的多次复制,权值小的粒子的剔除。可以看出,在整个重采样的过程中,粒子进行了两次种情况的刷新,一种是随机生成的新的粒子,一种是对原来的粒子的复制。得到的值越大,说明粒子的权重越小,当前粒子的可信度比较小,需要重采样粒子。

YiYeZhiNian的博客 1577

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码)

本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。

weixin_30607029的博客 674

回顾过往,让让我们一起看看Java 监控文件系统

简介 1.1 前言   每当文件发生任何更改时,它们都会自动刷新——这是大多数应用程序中常见的非常普遍的问题。每个应用程序都有一些配置,预期该配置文件中的每次更改都会刷新。解决该问题的过去方法包括使用Thread,根据配置文件的“最后更新时间戳”定期轮询文件更改。Java 从 JDK1.7 开始引入了一项出色的功能:WatchService 类,可用于监控文件系统的变化。WatchService 看作是文件监控器,通过操作系统原生文件系统来运行,可以监控系统是所有文件的变化,这种监控是无需遍历、无需比较的.

独泪了无痕 478

深入解析uncompyle6反编译pyc文件及常见错误修复指南

本文深入解析了使用uncompyle6工具反编译Python字节码文件(.pyc)的完整流程。针对实践中最高频的KeyError和Python版本范围限制两大错误,提供了详细的修复方案与步骤指南,并分享了处理复杂反编译结果的高级技巧与安全实践,是进行代码恢复、调试与分析的重要参考。

uber9的博客 534

文件变化监视 java.nio.file.WatchService

WatchKey java.nio.file.Path.register(WatchService watcher, Kind... events) throws IOException 为该文件注册watch service。 Registers the file located by this path with a watch service.  WatchKey java.nio

yichudu 5222

ArcGIS Pro样式导入全攻略:从.style到.stylx的完整转换流程(附常见问题解决)

本文详细解析了ArcGIS Pro中从旧版.style文件导入并转换为新版.stylx格式的完整流程。针对用户在迁移过程中常见的样式库为空、符号匹配失败、显示异常等问题,提供了清晰的排查思路与解决方案,帮助用户高效完成样式库的升级与迁移,确保制图工作的连续性。

raspberrypi5的博客 515

51单片机入门指南-基于STC89C52(持续更新)

一、环境介绍 编程IDE: keil5 单片机型号: STC89C51/52 开发板: 普中科技的开发板 完整PDF资源下载地址:https://download.csdn.net/download/xiaolong1126626497/19785856 二、51单片机开发手册介绍 2.1 前言 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最.

8797

BurpSuite动态请求重写引擎:从规则解析到脚本集成的架构实践

在Web安全测试与接口调试中,请求/响应拦截与修改是核心操作。传统静态替换方法难以应对动态签名、会话令牌生成等复杂场景,因此需要引入动态请求重写机制。其原理在于构建一个可插拔的规则引擎,通过解析外部配置(如JSON),实现请求参数的实时提取、逻辑运算与回写。该技术价值在于将修改逻辑与代码解耦,大幅提升测试自动化程度与灵活性。应用场景广泛覆盖API签名验证、业务逻辑测试、漏洞探测载荷变形等领域。本文聚焦于BurpSuite插件开发,深入探讨如何设计一个支持热重载、脚本引擎集成与上下文管理的动态重写框架,其中规

weixin_30892889的博客 421

西门子PLC编程之⑦编程开始之点位配置及注释

紧接上篇,点位梳理后,进入PLC编程。1、新建工程,配置系统模块2、配置I点并做中文符合,直接上中文,smart支持中文点位编程,用起来很方便。3、配置Q点并做中文符合5、配置AIW模拟量输入点,配置AQW模拟量输出点并做中文符合6、配置手动启动辅助触点,并做中文符合7、 配置自动启动辅助触点,并做中文符合8、 配置传感器浮点型数据变量点位,并做中文符合9、配置系统运行参数设置区点位,做中午符合,做掉电保持.....................

学技术,人生不误——谁也是寂寞宇宙里的流星,只是你的坚持决定了你划过的痕迹。而且,铸造了普遍里的你的唯一。 4888

Lithe-IDEA:专为Java/Spring Boot设计的轻量级开源IDE

IDE(集成开发环境)是Java开发者的核心生产力工具,其本质是代码编辑、智能感知、构建调试与语言服务的有机整合。现代IDE的性能瓶颈往往源于平台层技术债——如IntelliJ Platform的重量级架构与封闭PSI系统。轻量级IDE并非简单功能裁剪,而是通过Rust核心重构文件监听与编译调度、基于标准LSP对接Java语言服务(如nb-javac)、深度绑定Maven/Gradle原生构建输出,实现启动快、内存低、响应稳的技术价值。典型应用场景包括Spring Boot单模块开发、校招新人教学、旧笔记本

weixin_34127717的博客 310

15、基于最优传输的协作多视图聚类框架

本文提出了一种基于最优传输理论的协作多视图聚类框架,通过引入协作学习机制在不同视图间建立先验交互,以提升共识聚类的质量。框架包含两种新方法:协作共识投影方法(CoCP)和基于新表示的协作共识方法(CoCNR)。CoCP在全局空间中整合多视图信息并进行共识投影,而CoCNR则通过协作编码生成新的数据表示以实现更优聚类。方法利用熵正则化的Wasserstein距离与Wasserstein重心,有效捕捉数据分布间的几何结构,并通过聚合步骤获得统一模型。实验结果表明,所提方法在多个数据集上均优于现有方法,具有良好的

gpt4scribbler的博客 85

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java的WatchService的说明

是 Java 提供的一个 API,用于监控文件系统中的目录变化文件创建(ENTRY_CREATE)文件修改(ENTRY_MODIFY)文件删除(ENTRY_DELETE)溢出事件(OVERFLOW)文件同步工具日志监控程序自动备份系统IDE 监控项目文件变化。

Java的专栏 1253

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java 1.7watchservice特性学习 文件变更监控

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33895604的博客 260

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java中文件监控WatchService使用

java中文件监控WatchService使用 文章目录java中文件监控WatchService使用一、简介二、功能及应用2.1 功能2.2 应用三、关键接口、类和方法3.1 java.nio.file.WatchService接口3.2 java.nio.file.WatchEvent接口3.2 java.nio.file.WatchKey接口3.3 java.nio.file.Watchab...

panda-star的博客 1万+

使用java.nio.file.WatchService监控文件夹里的文件再操作文件出现的“文件不存在或目录不存在”的错误

当用java.nio.file.WatchKey得到文件创建的key后,,最好等待一下在进行对文件操作,因为那时新创建的文件可能还在被占用,或机械盘还没反应,所以最好用Thread.sleep();让线程沉睡一下在进行文件操作。

baidu_34906160的博客 883

Java NIO WatchService的多级目录监控问题

目录 前言 问题 递归监控子目录 windows系统 跨平台解决方案 跨平台多级目录监控方案 WatchService的其他注意事项 前言 java7+提供了WatchService类,可以用来实现对文件增删改的监控,demo很简单,代码如下: package com.test.filewatch; import java.io.IOException; import java.nio.file.*; import java.util.List; import...

我要上天和太阳肩并肩的专栏 1927

【java技术】文件变更监控方式

文件变更监控,主要涉及jdk自带的webservice和common-io工具的FileAlterationListenerAdaptor

dylan的博客 1515

JAVA 监控并获取日志类文件变化(新增)

使用 JDK7+(1.7之前没有的哈!?) 工具类 java.nio.file.WatchService 写来用于监控日志文件新增内容(只能检测获取新增内容哈!?中间改一手读不出来的哈!)要配置目录和文件哈! import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.charset.StandardChars.

qq_43159578的博客 1130

利用WatchService实现文件监视

Java.nio.file WatchService类图 FileSystem:当前系统默认的文件系统。 WatchService:文件系统监视服务的接口类,它的具体实现由监视服务提供者负责加载(不同的操作系统实现不同的加载类,如windows的WindowsWatchService类)。 Watchable:实现了Watchable接口的对象才能注册...

weixin_30544657的博客 330

java watchservice 原理,NIO 之 WatchService

NIO 之 WatchServiceJava 1.6版本以前是不存在目录监控的API的。如果要实现这种功能必须要自己遍历目录,记录各个文件的情况,然后定时全部遍历一次,从 JDK7 之后出现了 WatchService 类,实现了对目录下文件的监控。整体流程整个监控目录文件操作的流程大致如下:获取 WatchService注册指定目录的监视器 WatchService等待目录下的文件发生变化对发生...

weixin_39959236的博客 2157

[疯狂Java]NIO.2:WatchService、WatchKey(监控文件变化)

1. 旧版本监控文件变化的弊端:     1) 非常繁琐,必须自己手动开启一个后台线程每隔一段时间遍历一次目标节点并记录当前状态,然后和上一次遍历的状态对比,如果不相同就表示发生了变化,再采取相应的操作,这个过程非常长,都需要用户自己手动实现;     2) 效率低:效率都消耗在了遍历、保存状态、对比状态上了!这是因为旧版本的Java无法很好的利用OS文件系统的功能,因此只能这样笨拙地监控文件

Lirx_Tech的专栏 1万+
上一篇: 开发避坑指南(72):HttpHeaders 的add()方法和set()方法有什么区别?
下一篇: 并发编程原理与实战(三十九)并发基石ArrayBlockingQueue与LinkedBlockingQueue的底层实现与API设计解析
帧栈
博客等级 码龄2年 335粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帧栈

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值