Apache Commons 和 Java NIO 的区别
如果您处理的是文件或报告,并且需要自动化某个过程,那么您总是想知道自动化该过程的有效方法是什么。在金融行业,我就有过这样的经历,我想知道是否有一种库可以避免编写样板代码。文件监视器来拯救,但是等等什么是文件监视器,它是如何工作的?对于任何文件监视器,我们需要三件事:
- Listener — 监听创建、更新、删除等事件
- Observer –在一个目录或路径上,配置观察者来查找在该路径中发生的任何事件,并调用侦听器的相应方法。
- 最后一个Monitor是一个活动线程,它将为任何事件运行这个观察器。
观察者是Java中的一种行为设计模式,它指定了对象之间的通信:可观察对象和观察者。一个可观察对象是一个java对象,它通知观察者它状态的变化或者监听任何事件。让我们看看他们的理论和实现。
Java NIO
file包提供了Watch Service API,用于查找给定目录中文件的更改。要实现watch服务,需要遵循以下步骤:
- 为文件系统创建WatchService—Listener
- 用想要监视的监视器注册一个目录,并定义您感兴趣的事件-观察者
- 实现一个循环来等待传入的事件。保持定期检查任何新的事件。观察器队列用于添加发生的任何已定义事件。在事件到达时处理事件并执行代码—Monitor。
什么时候使用Watch Service API?
关心事件变化的应用程序(如编辑器和IDE)使用这个API。IDE中的代码热部署可能会使用这个服务。WatchService API是由操作系统级发生的事件驱动的。它收集系统缓冲区上的所有事件。如果删除或更新了大量文件,则有可能导致操作系统缓冲区溢出。如果应用程序不能足够快地处理事件,那么一些事件将在应用程序读取它们之前丢失或丢弃。为了处理这种情况,我们需要在系统上实现一个速率限制,它将给缓冲区时间来处理突发的活动,以避免溢出。此API不是为索引存储驱动器而设计的。大多数文件系统都支持将文件更改作为其实现的一部分。Watch Service API使用这个特性来监听操作系统发送的事件。但是,当文件系统本身不支持这种机制时,我们可以配置轮询机制来侦听事件。
Apache Commons
io是一个用于处理流、读取器、写入器和文件的实用程序包。要使用这个实现:
- 创建FileAlterationListener实现,用于处理文件/目录上的事件,如创建、更改和删除事件
- 使用FileAlterationObserver为目录或路径注册侦听器。
- 向FileAlterationMonitor注册观察者,该monitor将监视目录观察者
CommonsIO库不是基于操作系统事件的,因此不存在溢出问题。在每次轮询中,观察者使用目录中File Class的listFiles()获取文件列表,并将其与上次轮询获得的列表进行比较。
- 如果在上次轮询中找到一个文件,则在侦听器上调用onFileCreate()
- 如果从上次投票中获得的文件列表中没有在上次投票中找到的文件名,则在侦听器上调用onFileDelete()
- 如果找到匹配,则检查文件的属性是否有任何更改,如最后修改日期、长度等。在这个事件中,监听器上调用onFileChange()。
让我们创建一个例子,首先我们需要一个观察者目录并注册监听器:
File directory = new File(new File("."), "test");
FileAlterationObserver observer = new FileAlterationObserver(directory);
observer.addListener(this);
接下来,用Monitor注册观察者,它会创建一个新线程,在指定的时间间隔调用观察者:
long pollInterval = 100
FileAlterationMonitor monitor = new FileAlterationMonitor(pollInterval);
monitor.addObserver(observer);
monitor.start();
....monitor.stop();
监听器将拥有文件的处理逻辑,在本例中,我们覆盖onFileCreate()
@Override
public void onFileCreate(final File newFile) {
..
..
}
Apache commons监控使用轮询机制,算法以固定的时间间隔检查任何新的事件。它在Unix和Windows平台上工作得很好,并且支持网络驱动器。在我的经验中,JDK监视服务在使用网络驱动器时变得很复杂。它对大容量的文件也很有效。由于它在每次轮询间隔后轮询并调用listFiles(),如果输入文件流入不高,它将占用不必要的CPU周期。适当的轮询间隔可以在一定程度上有所帮助,但是与JDK WatchService相比,CPU周期占用率很高。另一方面,JDK WatchService是基于事件的,因此不需要轮询。它依赖于操作系统的事件机制来触发事件,因此需要更少的CPU。根据文件更改或事件触发的速率来确定CPU使用率。如果突发事件中发生了一系列事件,就会导致事件溢出。
ApacheCommons和Java NIO的区别
Apache Commons | Java NIO |
---|---|
Apache commons监控使用轮询机制,算法以固定的时间间隔检查任何新事件。 | JDK WatchService不需要轮询,它是基于事件的。 |
当大量文件被频繁丢弃时,它很有用。 | Watch Service API是为需要通知文件更改事件的应用程序设计的。它非常适合任何应用程序,如编辑器或ID |
它在Unix和Windows平台上工作得很好,并且支持网络驱动器。 | 不支持网络驱动器。 |
每次轮询时使用CPU周期。 | JDK WatchService依赖于操作系统的事件机制,因此不需要轮询。 |
它可以处理巨大的文件。 | 根据文件更改或事件触发的速率来确定CPU使用率。如果突发事件中发生了一系列事件,就会导致事件溢出。 |