Ú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.