Java - katalogstørrelse

1. Oversikt

I denne opplæringen - lærer vi hvordan du får tak i størrelsen på en mappe i Java - bruker Java 6, 7 og nye Java 8 samt Guava og Apache Common IO.

Til slutt - vi vil også få en menneskelig lesbar fremstilling av katalogstørrelsen.

2. Med Java

La oss starte med et enkelt eksempel på å beregne størrelsen på en mappe - ved å bruke summen av innholdet:

privat lang getFolderSize (filmappe) {lang lengde = 0; Fil [] filer = folder.listFiles (); int count = files.length; for (int i = 0; i <count; i ++) {if (filer [i] .isFile ()) {lengde + = filer [i] .lengde (); } annet {lengde + = getFolderSize (filer [i]); }} returlengde; }

Vi kan teste metoden vår getFolderSize () som i følgende eksempel:

@Test offentlig ugyldig nårGetFolderSizeRecursive_thenCorrect () {long expectSize = 12607; Filmappe = ny fil ("src / test / resources"); lang størrelse = getFolderSize (mappe); assertEquals (forventet størrelse, størrelse); }

Merk: listFiles () brukes til å liste opp innholdet i den gitte mappen.

3. Med Java 7

Neste - la oss se hvordan du bruker Java 7 for å få mappestørrelsen. I det følgende eksemplet - bruker vi Files.walkFileTree () å krysse alle filene i mappen for å summere størrelsene:

@Test offentlig ugyldig nårGetFolderSizeUsingJava7_thenCorrect () kaster IOException {long expectedSize = 12607; AtomicLong størrelse = ny AtomicLong (0); Banemappe = Paths.get ("src / test / resources"); Files.walkFileTree (mappe, ny SimpleFileVisitor () {@ Override public FileVisitResult visitFile (Path file, BasicFileAttributes attrs) kaster IOException {size.addAndGet (attrs.size ()); return FileVisitResult.CONTINUE;}}); assertEquals (expectSize, size.longValue ()); }

Legg merke til hvordan vi utnytter filsystemets trefeltfunksjoner her og bruker besøkende mønster for å hjelpe oss med å besøke og beregne størrelsene på hver fil og undermappe.

4. Med Java 8

Nå - la oss se hvordan du får mappestørrelsen ved hjelp av Java 8, strømoperasjoner og lambdas. I det følgende eksemplet - bruker vi Files.walk () å krysse alle filene i mappen for å summere størrelsen:

@Test offentlig ugyldig nårGetFolderSizeUsingJava8_thenCorrect () kaster IOException {long expectedSize = 12607; Banemappe = Paths.get ("src / test / resources"); lang størrelse = Files.walk (mappe) .filter (p -> p.toFile (). isFile ()) .mapToLong (p -> p.toFile (). lengde ()) .sum (); assertEquals (forventet størrelse, størrelse); }

Merk: mapToLong () brukes til å generere en LongStream ved å bruke lengde funksjon i hvert element - hvoretter vi kan sum og få et endelig resultat.

5. Med Apache Commons IO

Neste - la oss se hvordan du får mappestørrelsen ved hjelp av Apache Commons IO. I det følgende eksemplet bruker vi ganske enkelt FileUtils.sizeOfDirectory () for å få mappestørrelsen:

@Test offentlig ugyldig nårGetFolderSizeUsingApacheCommonsIO_thenCorrect () {long expectedSize = 12607; Filmappe = ny fil ("src / test / resources"); lang størrelse = FileUtils.sizeOfDirectory (mappe); assertEquals (forventet størrelse, størrelse); }

Merk at dette til punkt og prikke-verktøymetoden implementerer en enkel Java 6-løsning under panseret.

Vær også oppmerksom på at biblioteket også tilbyr en FileUtils.sizeOfDirectoryAsBigInteger () metode som håndterer sikkerhetsbegrensede kataloger bedre.

6. Med Guava

La oss nå se hvordan vi kan beregne størrelsen på en mappe Guava. I det følgende eksemplet - bruker vi Files.fileTreeTraverser () å krysse alle filene i mappen for å summere størrelsen:

@Test offentlig ugyldig nårGetFolderSizeUsingGuava_thenCorrect () {long expectSize = 12607; Filmappe = ny fil ("src / test / resources"); Iterable filer = Files.fileTraverser (). BreadthFirst (mappe); lang størrelse = StreamSupport.stream (files.spliterator (), false) .filter (f -> f.isFile ()) .mapToLong (File :: length) .sum (); assertEquals (forventet størrelse, størrelse); }

7. Menneskelig lesbar størrelse

Til slutt - la oss se hvordan du får en mer brukerlesbar representasjon av mappestørrelsen - ikke bare en størrelse i byte:

@Test offentlig ugyldig nårGetReadableSize_thenCorrect () {Filmappe = ny fil ("src / test / resources"); lang størrelse = getFolderSize (mappe); Streng [] enheter = ny streng [] {"B", "KB", "MB", "GB", "TB"}; int unitIndex = (int) (Math.log10 (størrelse) / 3); dobbel unitValue = 1 << (unitIndex * 10); String readableSize = new DecimalFormat ("#, ## 0. #") .format (size / unitValue) + "" + units [unitIndex]; assertEquals ("12,3 KB", readableSize); }

Merk: Vi brukte Desimalformat (“#, ## 0, #”) for å avrunde resultatet til en desimal.

8. Merknader

Her er noen notater om beregning av mappestørrelse:

  • Både Files.walk () og Files.walkFileTree () kaster et SecurityException hvis sikkerhetsadministrator nekter tilgang til startfilen.
  • Den uendelige sløyfen kan oppstå hvis mappen inneholder symbolske lenker.

9. Konklusjon

I denne raske opplæringen illustrerte vi eksempler på bruk av forskjellige Java versjoner, Apache Commons IO og Guava for å beregne størrelsen på en katalog i filsystemet.

Implementeringen av disse eksemplene finnes i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found