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 NIO.2에서는 디렉토리 함수를 사용하여 더 큰 확장을 허용하는 반복자를 반환 할 수 있습니다. 디렉토리 스트림 클래스는 디렉토리의 항목을 반복하는 데 사용할 수있는 객체입니다.
답변
매우 간단한 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
}