Java - Veličina direktorija
1. Pregled
U ovom uputstvu naučit ćemo kako doći do veličina mape na Javi - koristeći Javu 6, 7 i novu Javu 8, kao i Guava i Apache Common IO.
Napokon - dobit ćemo i čitljiv prikaz veličine direktorija.
2. S Javom
Počnimo s jednostavnim primjerom izračuna veličine mape - koristeći se zbrojem njegovog sadržaja:
private long getFolderSize (mapa datoteke) {long length = 0; Datoteka [] files = folder.listFiles (); int count = files.length; za (int i = 0; i <count; i ++) {if (datoteke [i] .isFile ()) {dužina + = datoteke [i] .length (); } else {dužina + = getFolderSize (datoteke [i]); }} dužina vraćanja; }
Možemo testirati našu metodu getFolderSize () kao u sljedećem primjeru:
@Test javna void whenGetFolderSizeRecursive_thenCorrect () {long očekujeSize = 12607; Mapa datoteke = nova datoteka ("src / test / resources"); duga veličina = getFolderSize (mapa); assertEquals (očekivanaVeličina, veličina); }
Bilješka: listFiles () koristi se za popis sadržaja dane mape.
3. Uz Javu 7
Dalje - da vidimo kako koristiti Java 7 da biste dobili veličinu mape. U sljedećem primjeru - koristimo Files.walkFileTree () za prelazak svih datoteka u mapi radi zbrajanja njihovih veličina:
@Test public void whenGetFolderSizeUsingJava7_thenCorrect () baca IOException {long očekujeSize = 12607; AtomicLong size = novi AtomicLong (0); Mapa puta = Paths.get ("src / test / resources"); Files.walkFileTree (mapa, novi SimpleFileVisitor () {@Override public FileVisitResult visitFile (Datoteka puta, BasicFileAttributes attrs) baca IOException {size.addAndGet (attrs.size ()); return FileVisitResult.CONTINUE;}}) assertEquals (očekuje seSize, size.longValue ()); }
Imajte na umu kako ovdje iskorištavamo mogućnosti zaobilaženja stabla datotečnog sustava i koristimo obrazac posjetitelja koji će nam pomoći da posjetimo i izračunamo veličine svake datoteke i podmape.
4. S Javom 8
Sada - da vidimo kako dobiti veličinu mape pomoću Java 8, stream operacije i lambda. U sljedećem primjeru - koristimo Files.walk () da biste prešli sve datoteke u mapi da zbrojite njihovu veličinu:
@Test public void whenGetFolderSizeUsingJava8_thenCorrect () baca IOException {long očekujeSize = 12607; Mapa puta = Paths.get ("src / test / resources"); duga veličina = Datoteke.walk (mapa) .filter (p -> p.toFile (). isFile ()) .mapToLong (p -> p.toFile (). length ()) .sum (); assertEquals (očekivanaVeličina, veličina); }
Bilješka: mapToLong () koristi se za generiranje a LongStream primjenom duljina funkcija u svakom elementu - nakon čega možemo iznos i dobiti konačni rezultat.
5. S Apache Commons IO
Dalje - pogledajmo kako pomoću veličine dobiti veličinu mape Apache Commons IO. U sljedećem primjeru - mi jednostavno koristimo FileUtils.sizeOfDirectory () da biste dobili veličinu mape:
@Test javna void whenGetFolderSizeUsingApacheCommonsIO_thenCorrect () {long očekujeSize = 12607; Mapa datoteke = nova datoteka ("src / test / resources"); duga veličina = FileUtils.sizeOfDirectory (mapa); assertEquals (očekivanaVeličina, veličina); }
Imajte na umu da ovo do točke korisna metoda implementira jednostavno rješenje Java 6 ispod haube.
Također, imajte na umu da knjižnica također nudi a FileUtils.sizeOfDirectoryAsBigInteger () metoda koja se bolje bavi sigurnosno ograničenim direktorijima.
6. S Guavom
Sada - da vidimo kako izračunati veličinu mape pomoću Guava. U sljedećem primjeru - koristimo Files.fileTreeTraverser () da biste prešli sve datoteke u mapi da zbrojite njihovu veličinu:
@Test javna void whenGetFolderSizeUsingGuava_thenCorrect () {long očekujeSize = 12607; Mapa datoteke = nova datoteka ("src / test / resources"); Iterable files = Files.fileTraverser (). WidththFirst (mapa); duga veličina = StreamSupport.stream (files.spliterator (), false) .filter (f -> f.isFile ()) .mapToLong (File :: length) .sum (); assertEquals (očekivanaVeličina, veličina); }
7. Čovjeku čitljiva veličina
Napokon - pogledajmo kako dobiti čitljiviji prikaz veličine mape, a ne samo veličine u bajtovima:
@Test public void whenGetReadableSize_thenCorrect () {Mapa datoteke = nova datoteka ("src / test / resources"); duga veličina = getFolderSize (mapa); Niz [] jedinice = novi niz [] {"B", "KB", "MB", "GB", "TB"}; int unitIndex = (int) (Math.log10 (veličina) / 3); dvostruka unitValue = 1 << (unitIndex * 10); String readableSize = novi DecimalFormat ("#, ## 0. #") .format (size / unitValue) + "" + jedinice [unitIndex]; assertEquals ("12,3 KB", čitljiva veličina); }
Napomena: Koristili smo DecimalFormat ("#, ## 0, #") rezultat zaokružiti na jedno decimalno mjesto.
8. Bilješke
Evo nekoliko napomena o izračunavanju veličine mape:
- Oba Files.walk () i Files.walkFileTree () bacit će SecurityException ako upravitelj sigurnosti uskrati pristup početnoj datoteci.
- Beskonačna petlja može se dogoditi ako mapa sadrži simboličke veze.
9. Zaključak
U ovom smo brzom vodiču ilustrirali primjere korištenja različitih Java verzije, Apache Commons IO i Guava za izračunavanje veličine direktorija u datotečnom sustavu.
Implementacija ovih primjera može se naći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.