src/main/java/com/github/davidmoten/rx/FileObservable.java
public final static Observable<WatchEvent<?>> from(final File file,
            final Action0 onWatchStarted, Kind<?>... kinds) {
        return watchService(file, kinds)
                // when watch service created call onWatchStarted
                .doOnNext(new Action1<WatchService>() {
                    @Override
                    public void call(WatchService w) {
                        if (onWatchStarted != null)
                            onWatchStarted.call();
                    }
                })
                // emit events from the WatchService
                .flatMap(TO_WATCH_EVENTS)
                // restrict to events related to the file
                .filter(onlyRelatedTo(file));
    }
public final static Observable<WatchEvent<?>> from(final File file,
            final Action0 onWatchStarted, Kind<?>... kinds) {
        return watchService(file, kinds)
                // when watch service created call onWatchStarted
                .doOnNext(new Action1<WatchService>() {
                    @Override
                    public void call(WatchService w) {
                        if (onWatchStarted != null)
                            onWatchStarted.call();
                    }
                })
                // emit events from the WatchService
                .flatMap(TO_WATCH_EVENTS)
                // restrict to events related to the file
                .filter(onlyRelatedTo(file));
    }
If file does not exist at subscribe time then is assumed to not be a
directory. If the file is not a directory (bearing in mind the aforesaid
assumption) then a {@link WatchService} is set up on its parent and
{@link WatchEvent}s of the given kinds are filtered to concern the file
in question. If the file is a directory then a {@link WatchService} is
set up on the directory and all events are passed through of the given
kinds.

@param file
file to generate watch events from
@param onWatchStarted
called when WatchService is created
@param kinds
kinds of watch events to register for
@return observable of watch events