W Javie, jak wyświetlić tylko podkatalogi z katalogu?
Chciałbym skorzystać z funkcjonalności java.io.File. Jaka jest najlepsza metoda w Javie, aby to zrobić?
Możesz użyć klasy File, aby wyświetlić listę katalogów.
File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
System.out.println(Arrays.toString(directories));
Aktualizacja
Komentarz autora do tego postu chciał szybszego sposobu, świetna dyskusja tutaj: Jak szybko pobrać listę katalogów w Javie?
Gruntownie:
Bardzo proste rozwiązanie Java 8:
Jest to równoważne użyciu FileFilter (działa również ze starszą Javą):
źródło
::
w tym przypadku?@Mohamed Mansour, prawie byłeś ... argument "dir", którego używałeś, jest w rzeczywistości aktualną ścieżką, więc zawsze zwróci prawdę. Aby sprawdzić, czy dziecko jest podkatalogiem, czy nie, musisz je przetestować.
źródło
Jeśli jesteś zainteresowany rozwiązaniem wykorzystującym Javę 7 i NIO.2, może to wyglądać tak:
źródło
źródło
Dla tych, którzy są również zainteresowani Javą 7 i NIO, istnieje alternatywne rozwiązanie powyższej odpowiedzi @ voo . Możemy użyć wywołania try-with-resources
Files.find()
i funkcji lambda, która jest używana do filtrowania katalogów.Możemy nawet filtrować katalogi według nazwy, zmieniając funkcję lambda:
lub według daty:
źródło
W 2012 roku (data zapytania) tak, nie dzisiaj.
java.nio
W przypadku takich wymagań należy preferować API.Okropne z tak wieloma odpowiedziami, ale nie w prosty sposób, w jaki bym tego użył
Files.walk().filter().collect()
.Globalnie możliwe są dwa podejścia:
1)
Files.walk(Path start, )
nie ma żadnychmaxDepth
ograniczeń2)
Files.walk(Path start, int maxDepth, FileVisitOption... options)
pozwala to ustawić.Bez określenia ograniczeń głębokości dałoby:
A jeśli z powodów przestarzałych potrzebujesz uzyskać Listę
File
, możesz po prostu dodaćmap(Path::toFile)
operację przed kolekcją:źródło
Files.list(Path)
prawdopodobnie to samo coFiles.walk(Path,1)
.Files.list(Path)
jest uczciwą alternatywą, jeśli nie chcemy iterować rekurencyjnie folderów. Aby iterować foldery rekurencyjnie,walk()
lepiej pasuje.Na liście odpowiedzi brakuje rozwiązania, które u mnie zadziałało. Dlatego zamieszczam tutaj to rozwiązanie:
Tutaj użyłem
org.apache.commons.io.filefilter.FileFilterUtils
z Apache commons-io-2.2.jar. Jego dokumentacja jest dostępna tutaj: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.htmlźródło
Biorąc pod uwagę katalog początkowy jako plik
String
String
ścieżkę jako parametr. W metodzie:listFiles
metodyźródło
Oto rozwiązanie dla mojego kodu. Zrobiłem tylko małą zmianę od pierwszej odpowiedzi . Spowoduje to wyświetlenie wszystkich folderów tylko w wybranym katalogu wiersz po wierszu:
źródło