code: public final static Observable<byte[]> tailFile(File file, long startPosition,
              long sampleTimeMs, int chunkSize) {
          Preconditions.checkNotNull(file);
          Observable<Object> events = from(file, StandardWatchEventKinds.ENTRY_CREATE,
                  StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW)
                          // don't care about the event details, just that there
                          // is one
                          .cast(Object.class)
                          // get lines once on subscription so we tail the lines
                          // in the file at startup
                          .startWith(new Object());
          return tailFile(file, startPosition, sampleTimeMs, chunkSize, events);
      }
docs: Returns an {@link Observable} that uses NIO {@link WatchService} (and a
  dedicated thread) to push modified events to an observable that reads and
  reports new sequences of bytes to a subscriber. The NIO
  {@link WatchService} events are sampled according to
  <code>sampleTimeMs</code> so that lots of discrete activity on a file
  (for example a log file with very frequent entries) does not prompt an
  inordinate number of file reads to pick up changes.
  
  @param file
  the file to tail
  @param startPosition
  start tailing file at position in bytes
  @param sampleTimeMs
  sample time in millis
  @param chunkSize
  max array size of each element emitted by the Observable. Is
  also used as the buffer size for reading from the file. Try
  {@link FileObservable#DEFAULT_MAX_BYTES_PER_EMISSION} if you
  don't know what to put here.
  @return observable of byte arrays