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.


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