Java - Ukuran Direktori

1. Ikhtisar

Dalam tutorial ini - kita akan belajar cara mendapatkan ukuran folder di Java - menggunakan Java 6, 7 dan Java 8 yang baru serta Guava dan Apache Common IO.

Terakhir - kita juga akan mendapatkan representasi ukuran direktori yang dapat dibaca manusia.

2. Dengan Java

Mari kita mulai dengan contoh sederhana menghitung ukuran folder - menggunakan jumlah isinya :

private long getFolderSize(File folder) { long length = 0; File[] files = folder.listFiles(); int count = files.length; for (int i = 0; i < count; i++) { if (files[i].isFile()) { length += files[i].length(); } else { length += getFolderSize(files[i]); } } return length; }

Kita bisa menguji metode getFolderSize () seperti pada contoh berikut:

@Test public void whenGetFolderSizeRecursive_thenCorrect() { long expectedSize = 12607; File folder = new File("src/test/resources"); long size = getFolderSize(folder); assertEquals(expectedSize, size); }

Catatan: listFiles () digunakan untuk membuat daftar konten folder yang diberikan.

3. Dengan Java 7

Selanjutnya - mari kita lihat cara menggunakan Java 7 untuk mendapatkan ukuran folder . Dalam contoh berikut - kami menggunakan Files.walkFileTree () untuk menelusuri semua file di folder untuk menjumlahkan ukurannya:

@Test public void whenGetFolderSizeUsingJava7_thenCorrect() throws IOException { long expectedSize = 12607; AtomicLong size = new AtomicLong(0); Path folder = Paths.get("src/test/resources"); Files.walkFileTree(folder, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { size.addAndGet(attrs.size()); return FileVisitResult.CONTINUE; } }); assertEquals(expectedSize, size.longValue()); }

Perhatikan bagaimana kami memanfaatkan kemampuan traversal pohon sistem file di sini dan memanfaatkan pola pengunjung untuk membantu kami mengunjungi dan menghitung ukuran setiap file dan subfolder.

4. Dengan Java 8

Sekarang - mari kita lihat bagaimana mendapatkan ukuran folder menggunakan Java 8, operasi aliran dan lambda . Dalam contoh berikut - kami menggunakan Files.walk () untuk melintasi semua file di folder untuk menjumlahkan ukurannya:

@Test public void whenGetFolderSizeUsingJava8_thenCorrect() throws IOException { long expectedSize = 12607; Path folder = Paths.get("src/test/resources"); long size = Files.walk(folder) .filter(p -> p.toFile().isFile()) .mapToLong(p -> p.toFile().length()) .sum(); assertEquals(expectedSize, size); }

Catatan: mapToLong () digunakan untuk menghasilkan LongStream dengan menerapkan fungsi panjang di setiap elemen - setelah itu kita bisa menjumlahkan dan mendapatkan hasil akhir.

5. Dengan Apache Commons IO

Selanjutnya - mari kita lihat cara mendapatkan ukuran folder menggunakan Apache Commons IO . Dalam contoh berikut - kami cukup menggunakan FileUtils.sizeOfDirectory () untuk mendapatkan ukuran folder:

@Test public void whenGetFolderSizeUsingApacheCommonsIO_thenCorrect() { long expectedSize = 12607; File folder = new File("src/test/resources"); long size = FileUtils.sizeOfDirectory(folder); assertEquals(expectedSize, size); }

Perhatikan bahwa metode to the point utility ini mengimplementasikan solusi Java 6 sederhana di bawah tenda.

Selain itu, perhatikan bahwa pustaka juga menyediakan metode FileUtils.sizeOfDirectoryAsBigInteger () yang menangani direktori yang dibatasi keamanan dengan lebih baik.

6. Dengan Jambu Biji

Sekarang - mari kita lihat cara menghitung ukuran folder menggunakan Jambu Biji . Dalam contoh berikut - kami menggunakan Files.fileTreeTraverser () untuk melintasi semua file di folder untuk menjumlahkan ukurannya:

@Test public void whenGetFolderSizeUsingGuava_thenCorrect() { long expectedSize = 12607; File folder = new File("src/test/resources"); Iterable files = Files.fileTraverser().breadthFirst(folder); long size = StreamSupport.stream(files.spliterator(), false) .filter(f -> f.isFile()) .mapToLong(File::length).sum(); assertEquals(expectedSize, size); }

7. Ukuran Terbaca Manusia

Terakhir - mari kita lihat cara mendapatkan representasi ukuran folder yang lebih mudah dibaca pengguna - bukan hanya ukuran dalam byte:

@Test public void whenGetReadableSize_thenCorrect() { File folder = new File("src/test/resources"); long size = getFolderSize(folder); String[] units = new String[] { "B", "KB", "MB", "GB", "TB" }; int unitIndex = (int) (Math.log10(size) / 3); double unitValue = 1 << (unitIndex * 10); String readableSize = new DecimalFormat("#,##0.#") .format(size / unitValue) + " " + units[unitIndex]; assertEquals("12.3 KB", readableSize); }

Catatan: Kami menggunakan DecimalFormat (“#, ## 0, #”) untuk membulatkan hasil menjadi satu tempat desimal.

8. Catatan

Berikut beberapa catatan tentang penghitungan ukuran folder:

  • Baik Files.walk () dan Files.walkFileTree () akan menampilkan SecurityException jika manajer keamanan menolak akses ke file awal.
  • Pengulangan tak terbatas dapat terjadi jika folder berisi tautan simbolik.

9. Kesimpulan

Dalam tutorial singkat ini, kami mengilustrasikan contoh penggunaan versi Java yang berbeda , Apache Commons IO dan Guava untuk menghitung ukuran direktori dalam sistem file.

Implementasi contoh-contoh ini dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.