Aliter Geschrieben 4. November 2011 Geschrieben 4. November 2011 Hallo! Ich versuche mich gerade an dem neuen WatchService im JDK7. Anhand vom Beispiel auf Oracle.com habe ich das implementiert: /** * @param args the command line arguments */ public static void main(String[] args) { try { WatchService watcher = FileSystems.getDefault().newWatchService(); WatchKey watchKey = Paths.get("C:/test/").register(watcher, new Kind<?>[] { StandardWatchEventKinds.ENTRY_CREATE}); while(true) { System.out.println("Waiting for Event"); watchKey = watcher.take(); for(WatchEvent event : watchKey.pollEvents()) { WatchEvent.Kind<?> kind = event.kind(); if(kind == StandardWatchEventKinds.OVERFLOW) { continue; } System.out.println("Event fired: " + kind); Path p = (Path) event.context(); System.out.println("Path: " + p.toAbsolutePath()); } if(!watchKey.reset()) { System.err.println("Fehler im Pfad"); watchKey.cancel(); watcher.close(); break; } } } catch (IOException ex) { Logger.getLogger(SWISReport.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(SWISReport.class.getName()).log(Level.SEVERE, null, ex); } } Wenn ich den absoluten Pfad der Datei ausgeben will, erhalte ich <Projektpfad>\<Gefundene-Datei>: Waiting for Event Event fired: ENTRY_CREATE Path: C:\Projekte\WatchServiceTest\test.xml Die gefundene Datei liegt aber, wie im "Paths.get()" angegeben, im Verzeichnis "C:/test/". Hat jemand eine Idee wie man den korrekten Pfad ermittelt? Vielleicht steh' ich auch einfach aufm Schlauch... Vielen Dank, Aliter
Dragon8 Geschrieben 4. November 2011 Geschrieben 4. November 2011 Hi, hast du es mit folgendem probiert, was in deinem verlinkten Artikel von Oracle genannt wurde: Path filename = ev.context(); Path child = dir.resolve(filename); Wobei dir ein Path Objekt ist, welches auf den Pfad zeigt den dein WatchService beobachtet. Ich kann es bei mir gerade nicht testen, da ich kein JDK 7 zur Verfügung habe, aber kann mir vorstellen, dass die gemeldete Datei im Path Objekt nur als relativer Pfad, also nur der Dateiname angegeben ist. Wenn du von ihm aber explizit einen Absoluten Pfad verlangst, erwartet er die Datei im aktuellen Arbeitsverzeichnis, in deinem Fall "C:\Projekte\WatchServiceTest" und gibt den absoluten Pfad dann auch so aus.
Aliter Geschrieben 5. November 2011 Autor Geschrieben 5. November 2011 Tatsächlich, das wars- danke. Hier zur Vollständigkeit halber der Code, mit den geänderten Stellen: public static void main(String[] args) { try { WatchService watcher = FileSystems.getDefault().newWatchService(); [B][SIZE="4"]Path watchDir = Paths.get("C:/test/");[/SIZE][/B] WatchKey watchKey = watchDir.register(watcher, new Kind<?>[] { StandardWatchEventKinds.ENTRY_CREATE}); while(true) { System.out.println("Waiting for Event"); watchKey = watcher.take(); for(WatchEvent event : watchKey.pollEvents()) { WatchEvent.Kind<?> kind = event.kind(); if(kind == StandardWatchEventKinds.OVERFLOW) { continue; } System.out.println("Event fired: " + kind); [B][SIZE="4"]Path p = watchDir.resolve( (Path) event.context());[/SIZE][/B] System.out.println("Path: " + p.toAbsolutePath()); } if(!watchKey.reset()) { System.err.println("Fehler im Pfad"); watchKey.cancel(); watcher.close(); break; } } } catch (IOException ex) { Logger.getLogger(WebServiceTest.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex) { Logger.getLogger(WebServiceTest.class.getName()).log(Level.SEVERE, null, ex); } } Und die korrekte Ausgabe: Waiting for Event Event fired: ENTRY_CREATE Path: C:\test\IMG_0811.jpg Waiting for Event Grüße Aliter
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden