1. Gambaran keseluruhan
Dalam tutorial ini - kita akan belajar bagaimana mendapatkan ukuran folder di Java - menggunakan Java 6, 7 dan Java 8 baru juga Jambu dan Apache Common IO.
Akhirnya - kami juga akan mendapat gambaran ukuran direktori yang dapat dibaca oleh manusia.
2. Dengan Java
Mari kita mulakan dengan contoh mudah untuk mengira ukuran folder - menggunakan jumlah kandungannya :
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 boleh menguji kaedah getFolderSize () seperti 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 menyenaraikan kandungan folder yang diberikan.
3. Dengan Java 7
Seterusnya - mari kita lihat cara menggunakan Java 7 untuk mendapatkan ukuran folder . Dalam contoh berikut - kami menggunakan Files.walkFileTree () untuk melintasi semua fail dalam 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 keupayaan penyebaran pokok sistem fail di sini dan memanfaatkan corak pelawat untuk membantu kami melawat dan mengira ukuran setiap fail dan subfolder.
4. Dengan Java 8
Sekarang - mari kita lihat bagaimana mendapatkan ukuran folder menggunakan Java 8, operasi aliran dan lambdas . Dalam contoh berikut - kami menggunakan Files.walk () untuk melintasi semua fail dalam 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 dapat menjumlahkan dan mendapatkan hasil akhir.
5. Dengan Apache Commons IO
Seterusnya - mari kita lihat cara mendapatkan ukuran folder menggunakan Apache Commons IO . Dalam contoh berikut - kita hanya 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 bahawa kaedah utiliti ini hingga ke tahap menerapkan penyelesaian Java 6 sederhana di bawah penutup.
Juga, perhatikan bahawa perpustakaan juga menyediakan kaedah FileUtils.sizeOfDirectoryAsBigInteger () yang menangani direktori terhad keselamatan dengan lebih baik.
6. Dengan Jambu Batu
Sekarang - mari kita lihat cara mengira saiz folder menggunakan Jambu Batu . Dalam contoh berikut - kami menggunakan Files.fileTreeTraverser () untuk melintasi semua fail dalam 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. Saiz Bacaan Manusia
Akhirnya - mari kita lihat bagaimana mendapatkan perwakilan yang lebih mudah dibaca pengguna mengenai ukuran folder - bukan hanya ukuran dalam bait:
@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 hasilnya menjadi satu perpuluhan.
8. Catatan
Berikut adalah beberapa nota mengenai pengiraan saiz folder:
- Kedua-dua Files.walk () dan Files.walkFileTree () akan membuang SecurityException jika pengurus keselamatan menolak akses ke fail permulaan.
- Gelung tak terhingga boleh berlaku jika folder mengandungi pautan simbolik.
9. Kesimpulannya
Dalam tutorial ringkas ini, kami menggambarkan contoh penggunaan versi Java yang berbeda , Apache Commons IO dan Guava untuk menghitung ukuran direktori dalam sistem fail.
Pelaksanaan contoh-contoh ini dapat dijumpai dalam projek GitHub - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.