Java / JDK 7 Downloaded?By Angsuman Chakraborty, Gaea News Network
Friday, September 4, 2009
I have just started playing with JDK 7 (JDK stands for Java development kit and is suitable for Java developers, others should just download the JRE). Java 7 comes with some impressive features. My personal favorite is the WatchService API, more on it later.
Java 7 hasn’t been released at the time of this writing. However you can download the early access versions to pleay with and get familiar with it by the time Java 7 is officially released.
Of the many features in Java 7, today we will just look at the WatchService, which for me is good enough reason to switch to Java 7, even before it is released. To avoid repeating myself, let’s first take a look at what the documentation has to say:
A watch service that watches 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.
Watchableobject is registered with a watch service by invoking its
registermethod, returning a
WatchKeyto represent the registration. When an event for an object is detected the key is signalled, and if not currently signalled, it is queued to the watch service so that it can be retrieved by consumers that invoke the
takemethods to retrieve keys and process events. Once the events have been processed the consumer invokes the key’s
resetmethod to reset the key which allows the key to be signalled and re-queued with further events.
Registration with a watch service is cancelled by invoking the key’s
cancelmethod. 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
resetmethod indicates if the key is valid.
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
resetmethod is only invoked after its events have been processed. The
closemethod may be invoked at any time to close the service causing any threads waiting to retrieve keys, to throw
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 knowingly discards events then it arranges for the key’s
pollEventsmethod to return an element with an event type of
OVERFLOW. This event can be used by the consumer as a trigger to re-examine the state of the object.
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
FileChannelclass defines methods to lock regions of a file against access by other programs.
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
ENTRY_MODIFYevent 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.
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.
Are you still with me? As you can see the documentation from Sun is, as usual, pretty confusing and meandering. The skinny is that now you can watch for changes in files within directories. Previously the only, and costly way, in Java was to periodically poll the file for changes.
Java 7 has made several enhancements to nio packages and incorporated more native functionality in a cross-platform manner. Check out java.nio.file.SimpleFileVisitor.
Java 7 features many file system changes:
A new filesystem interface that supports bulk access to file attributes (including MIME content types), escape to filesystem-specific APIs, and a service-provider interface for pluggable filesystem implementations. This API will work more consistently across platforms, will make it easier to write programs that gracefully handle the failure of filesystem operations, will provide more efficient access to a larger set of file attributes, will allow developers of sophisticated applications to take advantage of platform-specific features when absolutely necessary, and will allow support for non-native filesystems, such as network filesystems, to be "plugged in" to the platform.
Have you downloaded Java 7 yet? If not, do so now and let me know what is your favorite feature(s) in the latest and greatest incarnation of Java. We already have made plan to incorporate Java 7 WatchService feature in our production server.
Tags: Java 7, JDK 7