[java] 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에서 디렉토리 목록을 빠르게
검색하는 방법?

원래:

  1. 파일 구조를 제어한다면 그 상황에 빠지지 않으려 고 노력할 것입니다.
  2. 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
}