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:

  1. Töltse le a törölni kívánt könyvtár összes tartalmát
  2. Töröljön minden olyan gyermeket, amely nem könyvtár (kilépés a rekurzióból)
  3. Az aktuális könyvtár minden alkönyvtárához kezdje az 1. lépéssel (rekurzív lépés)
  4. 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:

  1. Fájl meglátogatása - törölje
  2. Látogasson el egy könyvtárba a bejegyzések feldolgozása előtt - ne tegyen semmit
  3. 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)
  4. 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.