Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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... :D

Vielen Dank,

Aliter

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.

  • Autor

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.