Java, 파일이 아닌 디렉토리의 하위 디렉터리만 나열
Java의 경우 디렉토리에서 하위 디렉토리만 나열하려면 어떻게 해야 합니까?
java.io을 사용하고 싶습니다.파일 기능. 이를 위해 Java에서 가장 적합한 방법은 무엇입니까?
파일 클래스를 사용하여 디렉토리를 나열할 수 있습니다.
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, 거의 다 왔어...사용하고 있는 「유효」인수는 실제로는 유효한 경로이기 때문에, 항상 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.io을 사용하고 싶습니다.파일 기능,
2012년(질문일)에는 오늘은 아닙니다. java.nioAPI는 이러한 요건에 적합해야 합니다.
답이 너무 많아서 끔찍하지만 간단한 방법은 아닌 것 같아요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
}
Java 7과 NIO에도 관심이 있는 사용자는 위의 @voo의 답변에 대한 대체 솔루션이 있습니다.자원과 함께 시행을 통해Files.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) {
...
}
lambda 함수를 변경하여 이름으로 디렉토리를 필터링할 수도 있습니다.
(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
문자 그대로, 모든 서브 디렉토리가 일람 표시됩니다(즉, 인쇄).기본적으로 항목을 목록에 저장할 필요가 없는 루프 같은 것입니다.이것이 가장 필요한 것이기 때문에, 여기에 두고 갑니다.
Path directory = Paths.get("D:\\directory\\to\\list");
Files.walk(directory, 1).filter(entry -> !entry.equals(directory))
.filter(Files::isDirectory).forEach(subdirectory ->
{
// do whatever you want with the subdirectories
System.out.println(subdirectory.getFileName());
});
나에게 효과가 있던 솔루션이 답 목록에서 누락되었습니다.이 때문에, 이 솔루션을 여기에 게재합니다.
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
여기서 사용한 적이 있습니다.org.apache.commons.io.filefilter.FileFilterUtilsapache commons-io-2.2.jar에서 가져옵니다.매뉴얼은 https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html 에서 구할 수 있습니다.
File files = new File("src");
// src is folder name...
//This will return the list of the subDirectories
List<File> subDirectories = Arrays.stream(files.listFiles()).filter(File::isDirectory).collect(Collectors.toList());
// this will print all the sub directories
Arrays.stream(files.listFiles()).filter(File::isDirectory).forEach(System.out::println);
「」로서 개시 한다.String
- 다음 작업이 필요한 메서드를 만듭니다.
Stringpath로 합니다.★★★★ - 시작 디렉토리를 기반으로 새 파일 개체를 만듭니다.
- 배열을 .
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!");
}
JAVA 7 Files API를 사용할 수 있습니다.
Path myDirectoryPath = Paths.get("path to my directory");
List<Path> subDirectories = Files.find(
myDirectoryPath ,
Integer.MAX_VALUE,
(filePath, fileAttr) -> fileAttr.isDirectory() && !filePath.equals(myDirectoryPath )
).collect(Collectors.toList());
특정 값을 원하는 경우 데이터를 수집하기 전에 원하는 값을 사용하여 콜 맵을 호출할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5125242/java-list-only-subdirectories-from-a-directory-not-files
'source' 카테고리의 다른 글
| MySQL 서버용으로 my.cnf 파일과 mariadb-server.cnf 파일을 모두 구성하는 이유는 무엇입니까?또, 이러한 파일은 어떻게 접속되어 있습니까? (0) | 2023.02.05 |
|---|---|
| Swisscom 클라우드의 MariaDB에 데이터베이스 추가 (0) | 2023.02.05 |
| jQuery 문자 영역의 커서 위치 설정 (0) | 2023.01.26 |
| 로거 메시지에서 JUnit 아사트를 실행하는 방법 (0) | 2023.01.26 |
| 탭 또는 창 간의 통신 (0) | 2023.01.26 |