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.