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.