Java - Directory méret

1. Áttekintés

Ebben az oktatóanyagban - megtanuljuk, hogyan szerezzük be a egy mappa mérete Java-ban - a Java 6, 7 és az új Java 8, valamint a Guava és az Apache Common IO használata.

Végül - kapunk egy ember által olvasható ábrázolást is a könyvtár méretéről.

2. Java-val

Kezdjük egy egyszerű példával a mappa méretének kiszámításához - tartalmának összegét felhasználva:

privát hosszú getFolderSize (Fájl mappa) {long length = 0; File [] fájlok = folder.listFiles (); int count = fájlok.hossz; for (int i = 0; i <count; i ++) {if (fájlok [i] .isFile ()) {hossz + = fájlok [i] .hossz (); } else {length + = getFolderSize (fájlok [i]); }} visszatérési hossz; }

Kipróbálhatjuk módszerünket getFolderSize () mint a következő példában:

@Test public void whenGetFolderSizeRecursive_thenCorrect () {long expectedSize = 12607; File mappa = new File ("src / test / resources"); hosszú méret = getFolderSize (mappa); assertEquals (várható méret, méret); }

Jegyzet: listFiles () az adott mappa tartalmának felsorolására szolgál.

3. Java 7-el

Következő - nézzük meg, hogyan kell használni Java 7, hogy megkapja a mappa méretét. A következő példában - használjuk Files.walkFileTree () hogy a mappa összes fájlját bejárja, és összegezze a méretüket:

@Test public void, amikorGetFolderSizeUsingJava7_thenCorrect () dobja az IOException-t {long várhatóSize = 12607; AtomicLong size = új AtomicLong (0); Útvonal mappa = Paths.get ("src / test / resources"); Files.walkFileTree (mappa, új SimpleFileVisitor () {@Override public FileVisitResult visitFile (elérési út, BasicFileAttributes attrs) dobja az IOException {size.addAndGet (attrs.size ()); return FileVisitResult.CONTINUE} assertEquals (várhatóSize, size.longValue ()); }

Ne feledje, hogyan használjuk ki a fájlrendszer fa átjárási képességeit itt, és a látogatói mintát használjuk fel az egyes fájlok és almappák meglátogatásához és kiszámításához.

4. Java 8-tal

Most - nézzük meg, hogyan lehet elérni a mappa méretét Java 8, stream műveletek és lambdas. A következő példában - használjuk Files.walk () hogy a mappa összes fájlját bejárja, és összegezze a méretüket:

@Test public void, amikorGetFolderSizeUsingJava8_thenCorrect () dobja az IOException-t {long várhatóSize = 12607; Útvonal mappa = Paths.get ("src / test / resources"); hosszú méret = Files.walk (mappa) .filter (p -> p.toFile (). isFile ()) .mapToLong (p -> p.toFile (). length ()) .sum (); assertEquals (várható méret, méret); }

Jegyzet: mapToLong () a létrehozására szolgál LongStream a hossz funkció az egyes elemekben - ami után tudjuk összeg és megkapja a végeredményt.

5. Apache Commons IO-val

Következő - nézzük meg, hogyan lehet elérni a mappa méretét Apache Commons IO. A következő példában - egyszerűen használjuk FileUtils.sizeOfDirectory () a mappa méretének megszerzéséhez:

@Test public void whenGetFolderSizeUsingApacheCommonsIO_thenCorrect () {long expectedSize = 12607; File mappa = new File ("src / test / resources"); hosszú méret = FileUtils.sizeOfDirectory (mappa); assertEquals (várható méret, méret); }

Ne feledje, hogy ez a pont segédprogram módszer egyszerű Java 6 megoldást valósít meg a motorháztető alatt.

Vegye figyelembe azt is, hogy a könyvtár a FileUtils.sizeOfDirectoryAsBigInteger () módszer, amely jobban foglalkozik a korlátozott biztonságú könyvtárakkal.

6. Guavával

Most - nézzük meg, hogyan lehet kiszámítani a mappa méretét Gujávafa. A következő példában - használjuk Files.fileTreeTraverser () hogy a mappa összes fájlját bejárja, és összegezze a méretüket:

@Test public void whenGetFolderSizeUsingGuava_thenCorrect () {long expectedSize = 12607; File mappa = new File ("src / test / resources"); Iterálható fájlok = Files.fileTraverser (). WidththFirst (mappa); hosszú méret = StreamSupport.stream (files.spliterator (), false) .filter (f -> f.isFile ()) .mapToLong (File :: length) .sum (); assertEquals (várható méret, méret); }

7. Az ember által olvasható méret

Végül - nézzük meg, hogyan lehet egy felhasználó által olvashatóbban ábrázolni a mappa méretét - nem csak a méretet bájtban:

@Test public void whenGetReadableSize_thenCorrect () {File mappa = new File ("src / test / resources"); hosszú méret = getFolderSize (mappa); Karakterlánc [] egységek = új karakterlánc [] {"B", "KB", "MB", "GB", "TB"}; int unitIndex = (int) (Math.log10 (méret) / 3); dupla unitValue = 1 << (unitIndex * 10); String readableSize = new DecimalFormat ("#, ## 0. #") .formátum (méret / egységérték) + "" + egységek [unitIndex]; assertEquals ("12,3 KB", readableSize); }

Megjegyzés: Mi használtuk DecimalFormat („#, ## 0, #”) hogy az eredményt egy tizedesjegyre kerekítse.

8. Megjegyzések

Íme néhány megjegyzés a mappa méretének kiszámításához:

  • Mindkét Files.walk () és Files.walkFileTree () dob egy SecurityException-t, ha a biztonsági menedzser megtagadja a hozzáférést a kezdő fájlhoz.
  • A végtelen ciklus akkor fordulhat elő, ha a mappa szimbolikus hivatkozásokat tartalmaz.

9. Következtetés

Ebben a gyors bemutatóban példákat illusztráltunk a különböző használatára Jáva verziók, Apache Commons IO és Gujávafa egy könyvtár méretének kiszámításához a fájlrendszerben.

Ezeknek a példáknak a megvalósítása megtalálható a GitHub projektben - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.