Könyvtár törlése rekurzív módon a Java-ban
1. Bemutatkozás
Ebben a cikkben bemutatjuk, hogyan lehet törölni egy könyvtárat rekurzív módon a sima Java-ban. Megvizsgálunk néhány alternatívát a könyvtárak törléséhez külső könyvtárak használatával.
2. Könyvtár törlése rekurzív módon
A Java lehetőséget ad egy könyvtár törlésére. Ehhez azonban a könyvtár üresnek kell lennie. Tehát rekurziót kell használnunk egy adott nem üres könyvtár törléséhez:
- Töltse le a törölni kívánt könyvtár összes tartalmát
- Töröljön minden olyan gyermeket, amely nem könyvtár (kilépés a rekurzióból)
- Az aktuális könyvtár minden alkönyvtárához kezdje az 1. lépéssel (rekurzív lépés)
- Törölje a könyvtárat
Vezessük be ezt az egyszerű algoritmust:
boolean deleteDirectory (Fájl könyvtárToBeDeleted) {Fájl [] allContents = könyvtárToBeDeleted.listFiles (); if (allContents! = null) {for (Fájl fájl: allContents) {deleteDirectory (fájl); }} return directoryToBeDeleted.delete (); }
Ez a módszer egyszerű tesztesettel tesztelhető:
@Test public void givenDirectory_whenDeletedWithRecursion_thenIsGone () dobja az IOException {Path pathToBeDeleted = TEMP_DIRECTORY.resolve (DIRECTORY_NAME); logikai eredmény = deleteDirectory (pathToBeDeleted.toFile ()); assertTrue (eredmény); assertFalse ("A könyvtár még mindig létezik", Files.exists (pathToBeDeleted)); }
A @Előtt teszt osztályunk metódusa létrehoz egy könyvtárfát alkönyvtárakkal és fájlokkal a pathToBeDeleted helyét és @Utána módszer megtisztítja a könyvtárat, ha szükséges.
Ezután nézzük meg, hogyan érhetjük el a törlést a két leggyakrabban használt könyvtár - az Apache - használatával commons-io és a Tavaszi keretrendszer rugómag. Mindkét könyvtár lehetővé teszi a könyvtárak törlését egyetlen kódsor használatával.
3. Használata FileUtils tól től commons-io
Először hozzá kell adnunk a commons-io függőség a Maven projekttől:
commons-io commons-io 2.5
A függőség legújabb verziója itt található.
Most már használhatjuk FileUtils bármilyen fájl alapú művelet végrehajtására, beleértve deleteDirectory () csak egy állítással:
FileUtils.deleteDirectory (fájl);
4. Használata FileSystemUtils tavasztól
Alternatív megoldásként felvehetjük az s-tpring-core függőség a Maven projekttől:
org.springframework rugós mag 4.3.10.FELHASZNÁLÁS
A függőség legújabb verziója itt található.
Használhatjuk a deleteRecursively () módszer ben FileSystemUtils a törlés végrehajtásához:
logikai eredmény = FileSystemUtils.deleteRecursively (fájl);
A Java legújabb kiadásai újabb módszereket kínálnak az IO műveletek végrehajtására, amelyeket a következő szakaszokban ismertetünk.
5. A NIO2 használata a Java 7 alkalmazással
A Java 7 egy teljesen új módszert vezetett be a fájlműveletek használatához Fájlok. Ez lehetővé teszi számunkra, hogy bejárjuk a könyvtárfát, és visszahívásokat használjunk az elvégzendő műveletekhez.
public void whenDeletedWithNIO2WalkFileTree_thenIsGone () dobja az IOException {Path pathToBeDeleted = TEMP_DIRECTORY.resolve (DIRECTORY_NAME); Files.walkFileTree (elérési út ) dobja az IOException {Files.delete (file); return FileVisitResult.CONTINUE;}}); assertFalse ("A könyvtár még mindig létezik", Files.exists (pathToBeDeleted)); }
A Files.walkFileTree () A módszer áthalad egy fájlfán és eseményeket bocsát ki. Meg kell határoznunk a visszahívásokat ezekhez az eseményekhez. Tehát ebben az esetben meghatározzuk SimpleFileVisitor hogy a következő műveleteket hajtsa végre a létrehozott eseményeknél:
- Fájl meglátogatása - törölje
- Látogasson el egy könyvtárba a bejegyzések feldolgozása előtt - ne tegyen semmit
- Látogatás egy könyvtárban a bejegyzések feldolgozása után - törölje a könyvtárat, mivel a könyvtár összes bejegyzése mára feldolgozásra került (vagy törölve lett volna)
- Nem lehet meglátogatni egy fájlt - újrakeresés IOException ez okozta a kudarcot
A fájlműveletek kezelésével kapcsolatos NIO2 API-kkal kapcsolatos további információkért olvassa el a Java NIO2 File API bevezetését.
6. Használata NIO2 Java 8-tal
A Java 8 óta a Stream API még jobb módot kínál a könyvtár törlésére:
@Test public void whenDeletedWithFilesWalk_thenIsGone () IOException-t dob {Path pathToBeDeleted = TEMP_DIRECTORY.resolve (DIRECTORY_NAME); Files.walk (pathToBeDeleted) .sorted (Comparator.reverseOrder ()) .map (Path :: toFile) .forEach (File :: delete); assertFalse ("A könyvtár még mindig létezik", Files.exists (pathToBeDeleted)); }
Itt, Files.walk () visszatér a Folyam nak,-nek Pálya hogy fordított sorrendben válogatunk. Ez a könyvtárak tartalmát jelölő utakat maga a könyvtárak elé helyezi. Ezt követően feltérképezi Pálya nak nek File és mindegyiket törli File.
7. Következtetés
Ebben a gyors bemutatóban a könyvtár törlésének különböző módjait tártuk fel. Míg láttuk, hogyan lehet a rekurziót használni a törléshez, megvizsgáltunk néhány könyvtárat, az NIO2 eseményeket kihasználó funkciókat és a Java 8 Path Stream-et, amely funkcionális programozási paradigmát használt.
A cikk összes forráskódja és tesztesete elérhető a GitHubon.