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(

在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(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) {
    ...
}
更新

作者在这篇文章上的评论想要一个更快的方式,这里有很好的讨论:

基本上:

  • 如果您控制文件结构,我会尽量避免陷入这种情况
  • 在JavaNIO.2中,您可以使用directories函数返回迭代器,以允许更大的扩展。目录流类是一个对象,您可以使用它来迭代目录中的条目

  • 将起始目录指定为
    字符串

  • 创建一个将
    字符串
    路径作为参数的方法。在方法中:
  • 基于起始目录创建新对象
  • 使用
    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);