Java에서 디렉토리의 하위 디렉토리 만 나열하려면 어떻게합니까?
java.io.File 기능을 사용하고 싶습니다.이 작업을 수행하는 데 Java에서 가장 좋은 방법은 무엇입니까?
Java에서 디렉토리의 하위 디렉토리 만 나열하려면 어떻게합니까?
java.io.File 기능을 사용하고 싶습니다.이 작업을 수행하는 데 Java에서 가장 좋은 방법은 무엇입니까?
답변:
File 클래스를 사용 하여 디렉토리를 나열 할 수 있습니다 .
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));
최신 정보
이 게시물에 대한 작성자의 의견은 더 빠른 방법을 원했고 여기에 훌륭한 토론이 있습니다. Java에서 디렉토리 목록을 빠르게 검색하는 방법?
원래:
매우 간단한 Java 8 솔루션 :
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
FileFilter를 사용하는 것과 동일합니다 (이전 Java에서도 작동).
File[] directories = new File("/your/path/").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
::
작동합니까?
@Mohamed Mansour 당신은 거의 거기에있었습니다 ... 당신이 사용하고 있던 "dir"인수는 실제로 현재의 경로이므로 항상 true를 반환합니다. 하위 디렉토리가 하위 디렉토리인지 확인하려면 해당 하위 디렉토리를 테스트해야합니다.
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));
Java 7 및 NIO.2를 사용하는 솔루션에 관심이있는 경우 다음과 같이 진행할 수 있습니다.
private static class DirectoriesFilter implements Filter<Path> {
@Override
public boolean accept(Path entry) throws IOException {
return Files.isDirectory(entry);
}
}
try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
for (Path p : ds) {
System.out.println(p.getFileName());
}
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
Java 7 및 NIO에도 관심이있는 사람들을 위해 위의 @voo 답변에 대한 대안 솔루션이 있습니다. 호출 하는 try-with-resourcesFiles.find()
와 디렉터리를 필터링하는 데 사용되는 람다 함수를 사용할 수 있습니다.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
final Path directory = Paths.get("/path/to/folder");
try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
paths.forEach(System.out::println);
} catch (IOException e) {
...
}
람다 함수를 변경하여 이름으로 디렉터리를 필터링 할 수도 있습니다.
(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")
또는 날짜 별 :
final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();
// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday
java.io.File 기능을 사용하고 싶습니다.
2012 년 (질문 날짜) 예, 오늘은 아닙니다. java.nio
이러한 요구 사항에는 API가 선호되어야합니다.
너무 많은 답변으로 끔찍하지만 내가 사용하는 간단한 방법은 Files.walk().filter().collect()
.
전 세계적으로 두 가지 접근 방식이 가능합니다.
1) 제한 Files.walk(Path start, )
이 없습니다.maxDepth
2) Files.walk(Path start, int maxDepth, FileVisitOption... options)
설정할 수 있습니다.
깊이 제한을 지정하지 않으면 다음을 제공합니다.
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
레거시 이유로 인해 목록을 File
가져와야하는 map(Path::toFile)
경우 수집하기 전에 작업을 추가하면 됩니다.
Path directory = Paths.get("/foo/bar");
try {
List<File> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.map(Path::toFile)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Files.list(Path)
아마와 동일하다 Files.walk(Path,1)
.
Files.list(Path)
는 반복적으로 폴더를 반복하고 싶지 않다면 공정한 대안입니다. 폴더를 재귀 적으로 반복하려면 walk()
더 적합합니다.
나를 위해 일한 솔루션이 답변 목록에서 누락되었습니다. 따라서이 솔루션을 여기에 게시하고 있습니다.
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
여기 org.apache.commons.io.filefilter.FileFilterUtils
에서는 Apache commons-io-2.2.jar에서 사용했습니다. 문서는 https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html에서 볼 수 있습니다.
시작 디렉토리가 String
String
경로를 매개 변수로 사용 하는 메소드를 작성하십시오 . 방법에서 :listFiles
메소드를 사용하여 현재 디렉토리에서 파일 배열 가져 오기여기 내 코드에 대한 해결책이 있습니다. 방금 첫 번째 답변에서 약간의 변경 을했습니다 . 그러면 원하는 디렉토리의 모든 폴더가 한 줄씩 나열됩니다.
try {
File file = new File("D:\\admir\\MyBookLibrary");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
for(int i = 0;i < directories.length;i++) {
if(directories[i] != null) {
System.out.println(Arrays.asList(directories[i]));
}
}
}catch(Exception e) {
System.err.println("Error!");
}