Java,只列出目录中的子目录,而不列出文件
在Java中,如何仅列出目录中的子目录 我想使用java.io.File功能,java中最好的方法是什么 您可以使用该类列出目录Java,只列出目录中的子目录,而不列出文件,java,file,Java,File,在Java中,如何仅列出目录中的子目录 我想使用java.io.File功能,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(
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));
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) {
...
}
更新
作者在这篇文章上的评论想要一个更快的方式,这里有很好的讨论:
基本上:
将起始目录指定为
字符串
字符串
路径作为参数的方法。在方法中:listFiles
方法获取当前目录中的文件数组@穆罕默德·曼苏尔你就快到了。。。您使用的“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();
}
private静态类DirectoriesFilter实现过滤器{
@凌驾
公共布尔接受(路径项)引发IOException{
返回文件.isDirectory(条目);
}
}
try(DirectoryStream ds=Files.newDirectoryStream(FileSystems.getDefault().getPath(root),new directorysfilter()){
用于(路径p:ds){
System.out.println(p.getFileName());
}
}捕获(IOE异常){
e、 printStackTrace();
}
一个非常简单的Java 8解决方案:
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
这相当于使用文件过滤器(也适用于较旧的Java):
这是我的代码的解决方案。我只是做了一点小小的改变。这将逐行列出所需目录中的所有文件夹:
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!");
}
试试看{
File File=新文件(“D:\\admir\\MyBookLibrary”);
String[]directories=file.list(新文件名过滤器(){
@凌驾
公共布尔接受(文件当前,字符串名称){
返回新文件(当前,名称).isDirectory();
}
});
for(int i=0;i
对于那些同样对Java 7和NIO感兴趣的人来说,有一个替代的解决方案。我们可以使用调用Files.find()
的资源和用于筛选目录的lambda函数进行尝试
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));
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) {
...
}
或按日期:
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
答案列表中缺少对我有效的解决方案。因此,我在此发布此解决方案:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
这里我使用了apachecommons-io-2.2.jar中的org.apache.commons.io.filefilter.FileFilterUtils
。其文档可在此处找到:ArrayList directories=new ArrayList(
Arrays.asList(
新文件(“您的/path/”).listFiles(文件::isDirectory)
)
);
我想使用java.io.File功能
2012年(问题日期)是的,不是今天<代码>java.nioAPI必须适合此类需求
答案太多了,这太糟糕了,但不是我使用的简单方法,那就是Files.walk().filter().collect()
在全球范围内,有两种方法是可行的:
1) Files.walk(路径开始,)
在
2) Files.walk(路径开始、int-maxDepth、FileVisitOption…选项)
允许设置它
在不指定任何深度限制的情况下,它将给出:
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
您可以使用Java7文件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());
Path myDirectoryPath=Path.get(“我的目录的路径”);
列出子目录=Files.find(
myDirectoryPath,
Integer.MAX_值,
(filePath,fileAttr)->fileAttr.isDirectory()&&!filePath.equals(myDirectoryPath)
).collect(Collectors.toList());
如果需要特定的值,可以在收集数据之前使用所需的值调用map。File files=new File(“src”);
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);
//src是文件夹名。。。
//这将返回子目录列表
List subdirectory=Arrays.stream(files.listFiles()).filter(File::isDirectory.collect(Collectors.toList());
//这将打印所有子目录
Arrays.stream(files.listFiles()).filter(File::isDirectory).forEach(System.out::println);
这将逐字列出(即打印)所有子目录。它基本上是一种循环,在这种循环中,您不需要将项目存储在列表之间。这是一个人最可能需要的,所以我把它放在这里
Path directory=Path.get(“D:\\directory\\to\\list”);
Files.walk(目录,1).filter(条目->!条目.equals(目录))
.filter(Files::isDirectory).forEach(子目录->
{
//对子目录执行任何操作
System.out.println(子目录.getFileName());
});
您好,谢谢您的回复。但我不必遍历目录中的所有项。我必须直接从目录中列出子目录。因为我有很多文件,一个目录中只有很少的子目录,所以检查isDirectory()非常耗时。请用另一种方式回复我。我更新了我的帖子,特别是看看Jon Skeet对这个问题的评论。Java NIO 2的NIO响应有一个迭代器,用于返回s的directories函数
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);