Periksa Jika Direktori Kosong di Java

1. Ikhtisar

Dalam tutorial singkat ini, kita akan mempelajari beberapa cara untuk mengetahui apakah sebuah direktori kosong atau tidak.

2. Menggunakan Files.newDirectoryStream

Pada Java 7, metode Files.newDirectoryStream mengembalikan DirectoryStream untuk mengulang semua entri dalam direktori . Jadi kita bisa menggunakan API ini untuk memeriksa apakah direktori yang diberikan kosong atau tidak:

public boolean isEmpty(Path path) throws IOException { if (Files.isDirectory(path)) { try (DirectoryStream directory = Files.newDirectoryStream(path)) { return !directory.iterator().hasNext(); } } return false; }

Untuk input non-direktori, kami akan mengembalikan false bahkan tanpa mencoba memuat entri direktori:

Path aFile = Paths.get(getClass().getResource("/notDir.txt").toURI()); assertThat(isEmpty(aFile)).isFalse();

Di sisi lain, jika inputnya adalah direktori, kami akan mencoba membuka DirectoryStream ke direktori itu. Kemudian kita akan menganggap direktori sebagai kosong jika dan hanya jika panggilan metode hasNext () pertama mengembalikan false . Jika tidak, ini tidak kosong:

Path currentDir = new File("").toPath().toAbsolutePath(); assertThat(isEmpty(currentDir)).isFalse();

The DirectoryStream adalah dapat ditutup sumber daya, jadi kita pembungkus itu di dalam try-dengan-sumber blok. Seperti yang kita duga, metode isEmpty mengembalikan nilai true untuk direktori kosong:

Path path = Files.createTempDirectory("baeldung-empty"); assertThat(isEmpty(path)).isTrue();

Di sini kami menggunakan Files.createTempDirectory untuk membuat direktori kosong dan sementara.

3. Menggunakan Files.list

Mulai JDK 8, metode Files.list menggunakan API Files.newDirectoryStream secara internal untuk mengekspos Stream . Setiap Path adalah entri di dalam direktori induk yang diberikan. Oleh karena itu, kami juga dapat menggunakan API ini untuk tujuan yang sama:

public boolean isEmpty(Path path) throws IOException { if (Files.isDirectory(path)) { try (Stream entries = Files.list(path)) { return !entries.findFirst().isPresent(); } } return false; }

Sekali lagi, kami hanya menyentuh entri pertama menggunakan metode findFirst . Jika Opsional yang dikembalikan kosong, direktori juga kosong.

The Streaming didukung oleh sumber daya I / O, jadi kita pastikan untuk melepaskannya tepat menggunakan mencoba-dengan-sumber blok.

4. Solusi yang Tidak Efisien

Baik Files.list dan Files.newDirectoryStream akan mengiterasi entri direktori dengan malas. Oleh karena itu, mereka akan bekerja dengan direktori besar dengan sangat efisien . Namun, solusi seperti ini tidak akan berfungsi dengan baik dalam skenario ini:

public boolean isEmpty(Path path) { return path.toFile().listFiles().length == 0; }

Ini akan memuat semua entri di dalam direktori yang akan sangat tidak efisien ketika berurusan dengan direktori besar.

5. Kesimpulan

Dalam tutorial singkat ini, kita mengenal beberapa cara efisien untuk memeriksa apakah sebuah direktori kosong atau tidak.

Seperti biasa, semua contoh tersedia di GitHub.