Periksa Jika Direktori Kosong di Java

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan membiasakan diri dengan beberapa cara untuk mengetahui sama ada direktori kosong atau tidak.

2. Menggunakan Files.newDirectoryStream

Pada Java 7, kaedah Files.newDirectoryStream mengembalikan DirektoriStream untuk mengulangi semua entri dalam direktori . Oleh itu, kita dapat 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 bukan direktori, kami akan mengembalikan palsu tanpa cuba memuatkan entri direktori:

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

Sebaliknya, jika inputnya adalah direktori, kami akan berusaha membuka DirectoryStream ke direktori tersebut. Kemudian kami akan menganggap direktori sebagai kosong jika dan hanya jika panggilan kaedah hasNext () pertama kembali palsu . Jika tidak, ia tidak kosong:

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

The DirectoryStream ialah Closeable sumber, jadi kita pembalut sedang ia di dalam blok cuba-dengan-sumber. Seperti yang kita jangkakan, kaedah isEmpty kembali benar untuk direktori kosong:

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

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

3. Menggunakan Files.list

Sehingga JDK 8, kaedah Files.list menggunakan API Files.newDirectoryStream secara dalaman untuk mendedahkan Stream . Setiap Laluan adalah entri di dalam direktori induk yang diberikan. Oleh 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 kaedah findFirst . Sekiranya Pilihan yang dikembalikan kosong, maka direktori juga kosong.

The Stream disokong oleh sumber I / O, jadi kita memastikan untuk melepaskannya sewajarnya menggunakan blok cuba-dengan-sumber.

4. Penyelesaian yang tidak cekap

Kedua-dua Files.list dan Files.newDirectoryStream akan melelar entri direktori malas. Oleh itu, mereka akan bekerja dengan direktori besar dengan cekap . Walau bagaimanapun, penyelesaian seperti ini tidak akan berfungsi dengan baik dalam senario ini:

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

Ini dengan penuh semangat akan memuatkan semua entri di dalam direktori yang akan cukup tidak cekap ketika berurusan dengan direktori besar.

5. Kesimpulan

Dalam tutorial ringkas ini, kami berkenalan dengan beberapa kaedah yang cekap untuk memeriksa sama ada direktori kosong atau tidak.

Seperti biasa, semua contoh boleh didapati di GitHub.