Java'da, bir dizinden yalnızca alt dizinleri nasıl listeleyebilirim?
Java.io.File işlevselliğini kullanmak istiyorum, bunu yapmak için Java'da en iyi yöntem nedir?
Java'da, bir dizinden yalnızca alt dizinleri nasıl listeleyebilirim?
Java.io.File işlevselliğini kullanmak istiyorum, bunu yapmak için Java'da en iyi yöntem nedir?
Yanıtlar:
Sen kullanabilirsiniz Dosya dizinleri listelemek için sınıf.
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));
Güncelleme
Yazarın bu gönderiye yaptığı yorum burada daha hızlı bir yol, harika bir tartışma istedi: Java'da dizinlerin bir listesini HIZLI bir şekilde nasıl alabilirim?
Temel olarak:
Çok basit bir Java 8 çözümü:
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
Bir FileFilter kullanmaya eşdeğerdir (eski Java ile de çalışır):
File[] directories = new File("/your/path/").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
::
Bu durumda çift kolon nasıl çalışır?
@Mohamed Mansour neredeyse oradaydınız ... Kullandığınız "dir" argümanı aslında geçerli yoldur, bu nedenle her zaman doğruya dönecektir. Çocuğun bir alt dizin olup olmadığını görmek için o çocuğu test etmeniz gerekir.
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 ve NIO.2 kullanan bir çözümle ilgileniyorsanız, şu şekilde olabilir:
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.File işlevini kullanmak istiyorum,
2012'de (sorunun tarihi) evet, bugün değil. java.nio
API, bu tür gereksinimler için tercih edilmelidir.
Bu kadar çok cevapla berbat, ama benim kullanacağım basit yol değil Files.walk().filter().collect()
.
Küresel olarak iki yaklaşım mümkündür:
1) Files.walk(Path start, )
herhangi bir maxDepth
sınırlama yoktur
2) Files.walk(Path start, int maxDepth, FileVisitOption... options)
ayarlamaya izin verir.
Herhangi bir derinlik sınırlaması belirtmeden, şunları verir:
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Ve eski nedenlerden dolayı, bir Listenizi almanız gerekiyorsa , toplamadan önce File
bir map(Path::toFile)
işlem ekleyebilirsiniz :
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)
muhtemelen aynı olan Files.walk(Path,1)
.
Files.list(Path)
, klasörleri yinelemeli olarak yinelemek istemiyorsak adil bir alternatiftir. Klasörleri yinelemeli olarak yinelemek için walk()
daha iyi uyuyor.
Java 7 ve NIO ile de ilgilenenler için, @ voo'nun yukarıdaki cevabına alternatif bir çözüm var . Biz kullanabilirsiniz deneyin-ile-kaynaklar bu aramaları Files.find()
ve dizinleri filtrelemek için kullanılan bir lambda fonksiyonu.
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 işlevini değiştirerek dizinleri ada göre bile filtreleyebiliriz:
(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")
veya tarihe göre:
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
Benim için işe yarayan çözüm, cevaplar listesinde eksik. Dolayısıyla bu çözümü buraya gönderiyorum:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
Burada org.apache.commons.io.filefilter.FileFilterUtils
Apache commons-io-2.2.jar'dan kullandım. Belgelerine buradan ulaşabilirsiniz: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html
Bir başlangıç dizini olarak verildiğinde String
String
Parametre olarak bir yol alan bir yöntem oluşturun . Yöntemde:listFiles
Yöntemi kullanarak geçerli dizindeki bir dizi dosya alınİşte kodum için çözüm. İlk cevaptan biraz değişiklik yaptım . Bu, tüm klasörleri yalnızca istenen dizinde satır satır listeleyecektir:
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'sini kullanabilirsiniz
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());
Belirli bir değer istiyorsanız, verileri toplamadan önce istediğiniz değerle haritayı çağırabilirsiniz.