Java - Saiz Direktori

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.