Heute möchte ich eine kleine Java-Applikation vorstellen, die ich letztens für einen Freund entwickeln sollte: AutoCopy

AutoCopy

Bei AutoCopy, dessen Quellcode in meinem GitHub-Repository zu finden ist, handelt es sich um eine kleine kommandozeilenbasierende Applikation, dessen Ziel es ist, ein vorkonfiguriertes Verzeichnis zu überwachen, um alle neu erstellten Dateien, zu einem ebenfalls vorkonfigurierten Zielort zu verschieben.

Technik

Aber zuerst möchte ich etwas zur Technik von AutoCopy erzählen.

Der Kern von AutoCopy basiert auf Apache Commons VFS, das unterschiedliche Dateisysteme unterstützt. Damit ist es mit AutoCopy bspw. möglich ein lokales Verzeichnis zu übewachen und gefundene Dateien automatisch auf einen entfernten FTP-Server zu verschieben.

Um automatisch über Aktivitäten in bestimmten Verzeichnissen benachrichtigt zu werden, wurde in Java 7 der sogenannte WatchService eingeführt. Mit Hilfe dieser Klasse ist in nur wenigen Zeilen möglich eine Überwachung für neu erstellte Dateien durchzuführen. Dazu hier ein Ausschnitt aus dem AutoCopy Sourcecode:

final Path input = Paths.get(props.getProperty("input"));

try (final WatchService watchService = FileSystems.getDefault().newWatchService()) {
    input.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);

    while (true) {
        System.out.printf("watching for files in %s ... %n", input);
        final WatchKey key = watchService.take(); // blocking
        key.pollEvents() ...
...

Zuerst wird mittels FileSystems.getDefault().newWatchService() ein neuer WatchService erzeugt und beim konfigurierten Ordner mit ENTRY_CREATE registriert. Der anschließende Aufruf der Methode take blockiert solange, bis eine Datei im entsprechenden Ordner erzeugt worden ist. take liefert eine Instanz der Schnittstelle WatchKey, die es über ihre Methode poll ermöglicht, auf alle in jenem Augenblick erzeugten Dateien zuzugreifen.

Java 8 Streams

AutoCopy war meine erste Gelegenheit in die neue Stream-API von Java 8 einzutauchen. Da ich das Konzept der Lambdas und der funktionalen Programmierung bereits von bspw. Scala her kannte, war die Einstiegshürde relativ klein. Allerdings muss ich trotzdem festhalten, dass es ein ganz anderes Programmieren ist. Ein "normaler" Java-Programmierer muss seine bekannten objektorientierten Gedankengänge komplett umstellen.

Aber genug vom theoretischen Kram, kommen wir direkt zum praktischen Quellcode. Hier wiederum ein kleiner Ausschnitt des AutoCopy Sourcecodes, das auf den Streams von Java 8 basiert:

key.pollEvents().stream()
        .filter(event -> event.kind() != StandardWatchEventKinds.OVERFLOW)
        .map(event -> (Path) event.context())
        .forEach(path -> {
            try {
                String inputName = path.toString();
                // Datei verschieben ...
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

Zuerst filtern wir alle OVERFLOW Poll-Events heraus, um anschließend diese Events auf Path zu mappen. Zuletzt iterieren wir mittels der forEach Methode über alle Path Instanzen und führen die Operation zum Verschieben der Dateien aus. Das war es schon. Streams verkürzen den Quellcode eines Java-Programmes ungemein, ohne dabei die Lesbarkeit zu verlieren, so dass der gesamte Quellcode von AutoCopy gerade einmal knapp über 40 Zeilen lang ist.

Installation, Konfiguration und Verwendung von AutoCopy

Nachdem ich einige Worte zur technischen Seite von AutoCopy verloren habe, kommt nun der für Anwender wichtigste Teil.

Nach dem Auschecken des Quellcodes bei GitHub, kann ein standalone Jar-Archiv mittels des Befehls sbt assembly erzeugt werden. sbt wird für das Bauen vorausgesetzt.

Vor dem Ausführen von AutoCopy sollte die Konfigurationsdatei config.conf erstellt werden. Diese enthält folgende zwei Einstellungsmöglichkeiten:

  • input: Ein zu überwachende Verzeichnis
  • output: Ein Ausgabeverzeichnis

Das Überwachen eines lokalen Verzeichnisses und das automatische Verschieben von Dateien auf einen FTP-Server, würde wie folgt aussehen:

input=/path/to/my/local/folder/
output=ftp://user:password@domain.tld/subfolder/

Nachdem die Konfiguration erstellt wurde, kann AutoCopy wie folgt ausgeführt werden:

  • Linux: java -cp .:autocopy-1.1.jar Main
  • Windows: java -cp .;autocopy-1.1.jar Main

Beachtet folgende Hinweise bei der Erstellung einer Batch-Datei für Java-Programme.

Zum Schluss noch eine kurze Demonstration von AutoCopy unter Windows:

blogroll
tags