Java - veľkosť adresára

1. Prehľad

V tomto výučbe sa dozvieme, ako získať veľkosť priečinka v Jave - pomocou Java 6, 7 a nového Java 8, ako aj Guava a Apache Common IO.

Nakoniec - dostaneme tiež ľudsky čitateľné znázornenie veľkosti adresára.

2. S programom Java

Začnime jednoduchým príkladom výpočtu veľkosti priečinka - pomocou súčtu jeho obsahu:

private long getFolderSize (priečinok so súbormi) {long length = 0; Súbor [] súbory = folder.listFiles (); int pocet = subory.length; for (int i = 0; i <count; i ++) {if (files [i] .isFile ()) {length + = files [i] .length (); } else {length + = getFolderSize (súbory [i]); }} dĺžka návratu; }

Môžeme otestovať našu metódu getFolderSize () ako v nasledujúcom príklade:

@ Test public void whenGetFolderSizeRecursive_thenCorrect () {dlho očakávaná veľkosť = 12607; Priečinok so súbormi = nový súbor ("src / test / resources"); dlhá veľkosť = getFolderSize (priečinok); assertEquals (expectSize, size); }

Poznámka: listFiles () slúži na vypísanie obsahu daného priečinka.

3. S programom Java 7

Ďalej - pozrime sa, ako sa používa Java 7 na získanie veľkosti priečinka. V nasledujúcom príklade - používame Files.walkFileTree () prechádzať všetky súbory v priečinku a sčítať ich veľkosti:

@ Test public void whenGetFolderSizeUsingJava7_thenCorrect () vyvolá IOException {dlho očakávaná veľkosť = 12607; AtomicLong size = nový AtomicLong (0); Priečinok cesty = Paths.get ("src / test / resources"); Files.walkFileTree (priečinok, nový SimpleFileVisitor () {@Override public FileVisitResult visitFile (súbor cesty, BasicFileAttributes attrs) hodí IOException {size.addAndGet (attrs.size ()); návrat FileVisitResult.CONTINUE;}}); assertEquals (expectSize, size.longValue ()); }

Všimnite si, ako tu využívame možnosti prechodu stromom súborového systému a ako využívame vzor návštevníka, ktorý nám pomáha navštíviť a vypočítať veľkosť každého súboru a podpriečinka.

4. S programom Java 8

Teraz - pozrime sa, ako zistiť veľkosť priečinka pomocou Java 8, operácie streamu a lambdy. V nasledujúcom príklade - používame Files.walk () prejsť všetky súbory v priečinku a sčítať ich veľkosť:

@ Test public void whenGetFolderSizeUsingJava8_thenCorrect () vyvolá IOException {dlho očakávaná veľkosť = 12607; Priečinok cesty = Paths.get ("src / test / resources"); long size = Files.walk (priečinok) .filter (p -> p.toFile (). isFile ()) .mapToLong (p -> p.toFile (). length ()) .sum (); assertEquals (expectSize, size); }

Poznámka: mapToLong () sa používa na generovanie a LongStream uplatnením dĺžka funkciu v každom prvku - po ktorej môžeme súčet a získate konečný výsledok.

5. S Apache Commons IO

Ďalej - pozrime sa, ako zistiť veľkosť priečinka pomocou Apache Commons IO. V nasledujúcom príklade - jednoducho použijeme FileUtils.sizeOfDirectory () získať veľkosť priečinka:

@Test public void whenGetFolderSizeUsingApacheCommonsIO_thenCorrect () {dlho očakávaná veľkosť = 12607; Priečinok so súbormi = nový súbor ("src / test / resources"); dlhá veľkosť = FileUtils.sizeOfDirectory (priečinok); assertEquals (expectSize, size); }

Upozorňujeme, že metóda obslužná k tomuto bodu implementuje jednoduché riešenie Java 6 pod kapotou.

Upozorňujeme tiež, že knižnica poskytuje aj FileUtils.sizeOfDirectoryAsBigInteger () metóda, ktorá lepšie zaobchádza s bezpečnostne obmedzenými adresármi.

6. S Guavou

Teraz - pozrime sa, ako vypočítať veľkosť priečinka pomocou Guava. V nasledujúcom príklade - používame Files.fileTreeTraverser () prejsť všetky súbory v priečinku a sčítať ich veľkosť:

@Test public void whenGetFolderSizeUsingGuava_thenCorrect () {dlho očakávaná veľkosť = 12607; Priečinok so súbormi = nový súbor ("src / test / resources"); Iterovateľné súbory = Files.fileTraverser (). BreadthFirst (priečinok); long size = StreamSupport.stream (files.spliterator (), false) .filter (f -> f.isFile ()) .mapToLong (File :: length) .sum (); assertEquals (expectSize, size); }

7. Ľahko čitateľná veľkosť

Nakoniec - pozrime sa, ako získať užívateľsky čitateľnejšie vyjadrenie veľkosti priečinka - nielen veľkosti v bajtoch:

@Test public void whenGetReadableSize_thenCorrect () {priečinok súborov = nový súbor ("src / test / resources"); dlhá veľkosť = getFolderSize (priečinok); String [] units = new String [] {"B", "KB", "MB", "GB", "TB"}; int unitIndex = (int) (Math.log10 (veľkosť) / 3); dvojitá unitValue = 1 << (unitIndex * 10); Reťazec readableSize = nový DecimalFormat ("#, ## 0. #") .format (veľkosť / unitValue) + "" + jednotky [unitIndex]; assertEquals ("12,3 KB", readableSize); }

Poznámka: Použili sme DecimalFormat („#, ## 0, #“) zaokrúhliť výsledok na jedno desatinné miesto.

8. Poznámky

Tu je niekoľko poznámok o výpočte veľkosti priečinka:

  • Oboje Files.walk () a Files.walkFileTree () Ak bezpečnostný manažér odmietne prístup k počiatočnému súboru, spôsobí výnimku SecurityException.
  • Ak priečinok obsahuje symbolické odkazy, môže sa vyskytnúť nekonečná slučka.

9. Záver

V tomto rýchlom výučbe sme ilustrovali príklady použitia rôznych Java verzie, Apache Commons IO a Guava na výpočet veľkosti adresára v súborovom systéme.

Implementáciu týchto príkladov možno nájsť v projekte GitHub - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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