Java - Katalogstørrelse

1. Oversigt

I denne vejledning - vi lærer, hvordan man får størrelse på en mappe i Java - ved hjælp af Java 6, 7 og den nye Java 8 samt Guava og Apache Common IO.

Endelig - vi får også en menneskelig læsbar gengivelse af katalogstørrelsen.

2. Med Java

Lad os starte med et simpelt eksempel på beregning af størrelsen på en mappe - ved hjælp af summen af ​​dets indhold:

privat lang getFolderSize (filmappe) {lang længde = 0; Fil [] filer = folder.listFiles (); int count = files.length; for (int i = 0; i <count; i ++) {if (filer [i] .isFile ()) {længde + = filer [i]. længde (); } andet {længde + = getFolderSize (filer [i]); }} returlængde; }

Vi kan teste vores metode getFolderSize () som i følgende eksempel:

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

Bemærk: listFiles () bruges til at liste indholdet af den givne mappe.

3. Med Java 7

Næste - lad os se, hvordan du bruger Java 7 for at få mappestørrelsen. I det følgende eksempel bruger vi Files.walkFileTree () at krydse alle filer i mappen for at opsummere deres størrelser:

@Test offentlig ugyldig nårGetFolderSizeUsingJava7_thenCorrect () kaster IOException {long expectedSize = 12607; AtomicLong størrelse = ny AtomicLong (0); Sti-mappe = Paths.get ("src / test / ressourcer"); Files.walkFileTree (mappe, ny SimpleFileVisitor () {@ Override public FileVisitResult visitFile (Sti-fil, BasicFileAttribut attributter) kaster IOException {size.addAndGet (attrs.size ()); returner FileVisitResult.CONTINUE;}}); assertEquals (expectSize, size.longValue ()); }

Læg mærke til, hvordan vi udnytter filsystemets traversale muligheder her og bruger besøgende mønster til at hjælpe os med at besøge og beregne størrelsen på hver fil og undermappe.

4. Med Java 8

Lad os nu se, hvordan man får mappestørrelsen ved hjælp af Java 8, stream-operationer og lambdas. I det følgende eksempel bruger vi Files.walk () at krydse alle filer i mappen for at opsummere deres størrelse:

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

Bemærk: mapToLong () bruges til at generere en LongStream ved at anvende længde funktion i hvert element - hvorefter vi kan sum og få et endeligt resultat.

5. Med Apache Commons IO

Næste - lad os se, hvordan man får mappestørrelsen ved hjælp af Apache Commons IO. I det følgende eksempel bruger vi simpelthen FileUtils.sizeOfDirectory () for at få mappestørrelsen:

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

Bemærk, at dette til punkt-hjælpemetoden implementerer en simpel Java 6-løsning under emhætten.

Bemærk også, at biblioteket også indeholder en FileUtils.sizeOfDirectoryAsBigInteger () metode, der bedre håndterer sikkerhedsbegrænsede mapper.

6. Med Guava

Lad os nu se, hvordan man beregner størrelsen på en mappe ved hjælp af Guava. I det følgende eksempel bruger vi Files.fileTreeTraverser () at krydse alle filer i mappen for at opsummere deres størrelse:

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

7. Menneskelig læsbar størrelse

Endelig - lad os se, hvordan man får en mere brugerlæselig gengivelse af mappestørrelsen - ikke kun en størrelse i byte:

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

Bemærk: Vi brugte Decimalformat (“#, ## 0, #”) for at afrunde resultatet til en decimal.

8. Bemærkninger

Her er nogle noter om mappestørrelsesberegning:

  • Begge Files.walk () og Files.walkFileTree () kaster et SecurityException, hvis sikkerhedsadministratoren nægter adgang til startfilen.
  • Den uendelige løkke kan forekomme, hvis mappen indeholder symbolske links.

9. Konklusion

I denne hurtige vejledning illustrerede vi eksempler på brug af forskellige Java versioner, Apache Commons IO og Guava for at beregne størrelsen på en mappe i filsystemet.

Implementeringen af ​​disse eksempler findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.