Senaraikan Fail dalam Direktori di Java

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat pelbagai cara untuk menyenaraikan fail dalam direktori .

2. Penyenaraian

Sekiranya kita ingin menyenaraikan semua fail dalam direktori dan melangkau penggalian lebih jauh ke dalam sub-direktori, kita hanya boleh menggunakan java.io.File # listFiles :

public Set listFilesUsingJavaIO(String dir) { return Stream.of(new File(dir).listFiles()) .filter(file -> !file.isDirectory()) .map(File::getName) .collect(Collectors.toSet()); }

3. Strim Direktori

Namun, Java 7 memperkenalkan alternatif yang lebih pantas untuk File # listFiles yang disebut DirectoryStream .

Mari lihat apa yang setara:

public Set listFilesUsingDirectoryStream(String dir) throws IOException { Set fileList = new HashSet(); try (DirectoryStream stream = Files.newDirectoryStream(Paths.get(dir))) { for (Path path : stream) { if (!Files.isDirectory(path)) { fileList.add(path.getFileName() .toString()); } } } return fileList; }

Kita dapat dengan mudah melihat bahawa sementara DirektoriStream mungkin lebih cepat, itu bukan sebahagian dari API Aliran dan tidak begitu senang bekerja dengannya.

Juga, DirectoryStream memerlukan kita menutup sumber, bermakna membungkusnya dengan cuba-dengan-sumber juga.

4. Berjalan

Atau, kita boleh menyenaraikan semua fail dalam direktori dengan berjalan kaki ing ia kepada dikonfigurasikan mendalam .

Mari gunakan java.nio.file.Files # berjalan untuk menyenaraikan semua fail dalam direktori ke kedalaman tertentu:

public Set listFilesUsingFileWalk(String dir, int depth) throws IOException { try (Stream stream = Files.walk(Paths.get(dir), depth)) { return stream .filter(file -> !Files.isDirectory(file)) .map(Path::getFileName) .map(Path::toString) .collect(Collectors.toSet()); } }

Sudah tentu, ingat untuk menggunakan try-with-resources sehingga pengendalian fail untuk dir ditutup dengan betul.

Atau, jika kita ingin mempunyai lebih banyak kawalan terhadap apa yang berlaku pada setiap fail yang dikunjungi, kita juga dapat menyediakan pelaksanaan pelawat:

public Set listFilesUsingFileWalkAndVisitor(String dir) throws IOException { Set fileList = new HashSet(); Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (!Files.isDirectory(file)) { fileList.add(file.getFileName().toString()); } return FileVisitResult.CONTINUE; } }); return fileList; }

Ini berguna semasa kita ingin melakukan pembacaan, pemindahan, atau penghapusan fail tambahan semasa kita pergi.

5. Kesimpulan

Dalam tutorial ringkas ini, kami meneroka pelbagai cara untuk menyenaraikan fail dalam direktori.

Seperti biasa, kod sumber penuh contoh terdapat di GitHub.