Útmutató a WatchService alkalmazáshoz a Java NIO2-ben

1. Áttekintés

Ebben a cikkben a WatchService Java NIO.2 fájlrendszer API-k interfésze. Ez az egyik kevésbé ismert jellemzője az újabb IO API-knak, amelyeket a Java 7-ben vezettek be FileVisitor felület.

A WatchService felhasználói felületén kell importálnia a megfelelő osztályokat:

import java.nio.file. *;

2. Miért kell használni WatchService

Gyakori példa annak megértésére, hogy a szolgáltatás mit csinál, valójában az IDE.

Talán észrevette, hogy az IDE-k mindig a forráskód fájlok változását észleli amelyek önmagán kívül történnek. Néhány IDE párbeszédpanel segítségével tájékoztatja Önt, hogy Ön dönthessen úgy, hogy újból betölti a fájlt a fájlrendszerből, vagy sem, mások egyszerűen frissítik a fájlt a háttérben.

Hasonlóképpen, az olyan újabb keretrendszerek, mint a Play, alapértelmezés szerint az alkalmazás kódjának gyors újratöltését is elvégzik - valahányszor szerkesztéseket hajt végre bármely szerkesztőből.

Ezek az alkalmazások az ún fájlmódosítási értesítés amely minden fájlrendszerben elérhető.

Alapvetően, kódot írhatunk a fájlrendszer lekérdezéséhez az egyes fájlok és könyvtárak változásaihoz. Ez a megoldás azonban nem skálázható, különösen, ha a fájlok és könyvtárak eléri a százakat és ezreket.

A Java 7 NIO.2 alkalmazásban a WatchService Az API skálázható megoldást kínál a könyvtárak változásainak figyelemmel kísérésére. Tiszta API-val rendelkezik, és annyira jól van optimalizálva a teljesítményre, hogy nincs szükségünk saját megoldás megvalósítására.

3. Hogyan működik az őrszolgálat?

A WatchService funkciók, az első lépés a WatchService például a java.nio.file.FileSystems osztály:

WatchService watchService = FileSystems.getDefault (). NewWatchService ();

Ezután létre kell hoznunk az elérni kívánt könyvtár elérési útját:

Path path = Paths.get ("pathToDir");

E lépés után regisztrálnunk kell az utat az őrszolgálatnál. Ebben a szakaszban két fontos fogalmat kell megérteni. A StandardWatchEventKinds osztály és a WatchKey osztály. Vessen egy pillantást a következő regisztrációs kódra, hogy megértse, hová esnek. Ezt követjük a magyarázatokkal:

WatchKey watchKey = path.register (watchService, StandardWatchEventKinds ...);

Csak két fontos dolgot vegyen figyelembe itt: Először az útvonal-regisztrációs API hívás az első figyelő szolgáltatási példányt veszi át első paraméterként, amelyet a StandardWatchEventKinds. Másodszor, a regisztrációs folyamat visszatérési típusa a WatchKey példa.

3.1. A StandardWatchEventKinds

Ez egy olyan osztály, amelynek példányai megmondják az őrszolgálatnak, hogy milyen eseményeket kell figyelni a regisztrált könyvtárban. Jelenleg négy lehetséges esemény figyelhető meg:

  • StandardWatchEventKinds.ENTRY_CREATE - akkor vált ki, amikor új bejegyzés történik a figyelt könyvtárban. Ennek oka lehet egy új fájl létrehozása vagy egy meglévő fájl átnevezése.
  • StandardWatchEventKinds.ENTRY_MODIFY - akkor vált ki, ha a figyelt könyvtárban egy meglévő bejegyzés módosul. Az összes fájlszerkesztés kiváltja ezt az eseményt. Egyes platformokon még a fájlattribútumok megváltoztatása is kiváltja.
  • StandardWatchEventKinds.ENTRY_DELETE - akkor vált ki, amikor egy bejegyzést törölnek, áthelyeznek vagy átneveznek a figyelt könyvtárba.
  • StandardWatchEventKinds.OVERFLOW - az elveszett vagy eldobott események jelzésére szolgál. Nem nagyon fogunk rá koncentrálni

3.2. A WatchKey

Ez az osztály egy könyvtár regisztrálását jelenti az őrszolgálatnál. Példáját az őrszolgálat visszaküldi nekünk, amikor regisztrálunk egy könyvtárat, és amikor megkérdezzük az őrszolgálattól, hogy történtek-e olyan események, amelyekre regisztráltunk.

A Watch szolgáltatás nem kínál nekünk visszahívási módszereket, amelyeket minden esemény bekövetkezésekor hívnak meg. Csak többféleképpen kérdezhetjük le ezeket az információkat.

Használhatjuk a közvélemény kutatás API:

WatchKey watchKey = watchService.poll ();

Ez az API-hívás azonnal visszatér. Visszaadja a következő várakozási sorban lévő kulcsot, amelynek bármely eseménye megtörtént, vagy null, ha nem történt regisztrált esemény.

Használhatunk egy túlterhelt verziót is, amely a időtúllépés érv:

WatchKey watchKey = watchService.poll (hosszú időtúllépés, TimeUnit egységek);

Ez az API-hívás hasonló az előzőhez visszatérési értékben. Azonban blokkolja időtúllépés időegységek, hogy több időt adjanak, amelyen belül egy esemény bekövetkezhet, ahelyett, hogy azonnal visszaadnák a nullát.

Végül használhatjuk a vesz API:

WatchKey watchKey = watchService.take ();

Ez az utolsó megközelítés egyszerűen blokkol, amíg egy esemény bekövetkezik.

Itt valami nagyon fontosat kell megjegyeznünk: amikor az WatchKey példányt bármelyik közvélemény kutatás vagy vesz API-k, nem fog több eseményt rögzíteni, ha a reset API-t nem hívják meg:

watchKey.reset ();

Ez azt jelenti, hogy a figyelő kulcs példányt minden alkalommal eltávolítják a figyelő szolgáltatási sorból, valahányszor visszaküldi egy közvélemény-kutatási művelet. A Visszaállítás Az API hívás visszahelyezi a sorba, hogy további eseményeket várjon.

A figyelő szolgáltatás legpraktikusabb alkalmazásához olyan hurokra lenne szükség, amelyen belül folyamatosan ellenőrizzük, hogy vannak-e változások a figyelt könyvtárban, és ennek megfelelően dolgozunk fel. Ennek megvalósításához a következő szólást használhatjuk:

WatchKey kulcs; while ((kulcs = watchService.take ())! = null) {for (WatchEvent esemény: key.pollEvents ()) {// folyamat} key.reset (); }

Létrehozunk egy figyelő kulcsot a lekérdezési művelet visszatérési értékének tárolásához. A while ciklus addig blokkol, amíg a feltételes utasítás egy figyelő kulccsal vagy nullával nem tér vissza.

Amikor kapunk egy figyelő kulcsot, akkor a while ciklus végrehajtja a benne lévő kódot. Használjuk a WatchKey.pollEvents API a bekövetkezett események listájának visszaadásához. Ezután használjuk a az egyes hurok, hogy egyesével feldolgozza őket.

Az összes esemény feldolgozása után meg kell hívnunk a Visszaállítás API a figyelő kulcs újbóli megjelenítéséhez.

4. Könyvtár-nézési példa

Mivel lefedtük a WatchService Az előző alfejezet API-ja és hogyan működik belsőleg, valamint hogyan tudjuk használni, most folytathatjuk a teljes és praktikus példát.

Hordozhatósági okokból figyelni fogjuk a felhasználói otthoni könyvtár tevékenységét, amelynek minden modern operációs rendszeren elérhetőnek kell lennie.

A kód csak néhány kódsort tartalmaz, ezért csak a fő módszerben tartjuk:

public class DirectoryWatcherExample {public static void main (String [] args) {WatchService watchService = FileSystems.getDefault (). newWatchService (); Path path = Paths.get (System.getProperty ("user.home")); path.register (watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); WatchKey kulcs; while ((kulcs = watchService.take ())! = null) {for (WatchEvent esemény: key.pollEvents ()) {System.out.println ("Esemény fajtája:" + event.kind () + ". Érintett fájl : "+ esemény.kontextus () +". "); } key.reset (); }}}

És valóban csak ezt kell tennünk. Most futtathatja az osztályt, hogy megkezdhesse a könyvtár nézését.

Amikor a felhasználó saját könyvtárába navigál, és bármilyen fájlkezelési tevékenységet végez, például létrehoz egy fájlt vagy könyvtárat, megváltoztatja a fájl tartalmát vagy akár töröl egy fájlt, mindez naplózásra kerül a konzolon.

Például feltételezve, hogy a felhasználó otthonába megy, kattintson a jobb egérgombbal az űrben, és válassza a `lehetőségetúj -> fájl " hogy új fájlt hozzon létre, majd nevezze el testFile. Ezután hozzáad egy kis tartalmat és ment. A konzol kimenete a következőképpen fog kinézni:

Esemény fajtája: ENTRY_CREATE. Érintett fájl: Új szöveges dokumentum.txt. Esemény fajtája: ENTRY_DELETE. Érintett fájl: Új szöveges dokumentum.txt. Esemény fajtája: ENTRY_CREATE. Érintett fájl: testFile.txt. Esemény fajtája: ENTRY_MODIFY. Érintett fájl: testFile.txt. Esemény fajtája: ENTRY_MODIFY. Érintett fájl: testFile.txt.

Nyugodtan szerkesztheti az elérési utat bármelyik megtekinteni kívánt könyvtárhoz.

5. Következtetés

Ebben a cikkben megvizsgáltuk a Java 7 NIO.2 - fájlrendszer API-kban elérhető néhány kevésbé használt funkciót, különösen a WatchService felület.

Sikerült is elvégeznünk egy könyvtármegfigyelő alkalmazás felépítését a funkcionalitás bemutatása érdekében.

És mint mindig, a cikkben használt példák teljes forráskódja is elérhető a Github projektben.