Status: released to Maven Central
Requires Java 7.
Observable utilities for files:
- tail a file (either lines or byte[])
- trigger tail updates using Java 7 and later NIO
WatchServiceevents - or trigger tail updates using any Observable
- stream
WatchEvents from aWatchService - backpressure support
- tested on Linux and Windows 7 (not OSX, help appreciated!)
Maven site reports are here including javadoc.
For RxJava 2.x see rxjava2-file.
Getting started
Add this maven dependency to your pom.xml:
<dependency> <groupId>com.github.davidmoten</groupId> <artifactId>rxjava-file</artifactId> <version>0.4.4</version> </dependency>
How to build
git clone https://github.com/davidmoten/rxjava-file
cd rxjava-file
mvn clean install Examples
Tail a text file with NIO
Tail the lines of the text log file /var/log/server.log as an Observable<String>:
import com.github.davidmoten.rx.FileObservable; import rx.Observable; import java.io.File; Observable<String> items = FileObservable.tailer() .file("/var/log/server.log") .startPosition(0) .sampleTimeMs(500) .chunkSize(8192) .utf8() .tailText();
or, using defaults (will use default charset):
Observable<String> items = FileObservable.tailer() .file("/var/log/server.log") .tailText();
Note that if you want the Observable<String> to be emitting line by line then wrap
it with a call like StringObservable.split(observable, "\n"). StringObservable is in the RxJava rxjava-string artifact.
Tail a text file without NIO
The above example uses a WatchService to generate WatchEvents to prompt rereads of the end of the file to perform the tail.
To use polling instead (say every 5 seconds):
Observable<String> items = FileObservable.tailer() .file(new File("var/log/server.log")) .source(Observable.interval(5, TimeUnit.SECONDS) .tailText();
Tail a binary file with NIO
Observable<byte[]> items = FileObservable.tailer() .file("/tmp/dump.bin") .tail();
Tail a binary file without NIO
Observable<byte[]> items = FileObservable.tailer() .file("/tmp/dump.bin") .source(Observable.interval(5, TimeUnit.SECONDS) .tail();