获取文件夹下的所有文件

文章介绍了在Java中如何递归遍历文件夹,包括使用File类的listFiles()方法和JDK8引入的Files.walk()方法。Files.walk()提供了更简洁的流式处理方式,支持深度限制和文件过滤,且能自动处理符号链接。
摘要由CSDN通过智能技术生成
文件夹下会有文件和文件夹都存在的情况。

一、递归

File类提供了如下两个方法:

1.file.list():返回目录下文件和子目录名;

2.file.listFiles():返回目录下文件和子目录File对象;


    private List<String> getFileNames(String path) {
        File file = new File(path);
        if (!file.exists()) {
            return null;
        }
        List<String> fileNames = new ArrayList<>();
        return getFileNames(file, fileNames);
    }


    private List<String> getFileNames(File file, List<String> fileNames) {
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                getFileNames(f, fileNames);
            } else {
                fileNames.add(f.getName());
            }
        }
        return fileNames;
    }

二. Files.walk()
 

在jdk8中,可以使用walk方法递归的去查找目录下所有文件。


        String path = "D:\\xxx";
		try (Stream<Path> paths = Files.walk(Paths.get(path))){
            List<Path> fileNames = paths
                    .filter(Files::isRegularFile)
                    .collect(Collectors.toList());
        } catch (IOException e) {
            e.printStackTrace();
        }

walk方法会自动递归子目录。
上例使用了Try with Resources模式,它可以确保无论在什么情况下,流都将关闭。
解释:
如果try块和finally块中的方法都抛出异常那么try块中的异常会被抑制(suppress),只会抛出finally中的异常,而把try块的异常完全忽略。而try-with-resources语句能够帮你自动调用资源的close()函数关闭资源不用到finally块。

walk方法解释:

通过遍历以给定起始文件为根的文件树,返回一个用 Path 惰性填充的 Stream。文件树是深度优先遍历的,流中的元素是 Path 对象,就好像通过解析相对路径来获得的一样。此方法的工作方式就像调用它等同于评估表达式: walk(start, Integer.MAX_VALUE, options) 换句话说,它访问文件树的所有级别。返回的流封装了一个或多个 DirectoryStream。如果需要及时处理文件系统资源,则应使用 try-with-resources 构造来确保在流操作完成后调用流的 close 方法。对关闭的流进行操作将导致 illegalStateException。
 

maxDepth参数,设置要递归的深度;Files.walk(Paths.get(path),2)
默认不会自动跟随符号链接, 设置options参数FOLLOW_LINKS选项,则遵循符号链接。 Files.walk(Paths.get(path),FileVisitOption.FOLLOW_LINKS)
 

	String path = "D:\\xxx";
	
	try (Stream<Path> paths = Files.walk(Paths.get(dirName))) {
	    paths.filter(Files::isDirectory)
	            .forEach(System.out::println);
	}
 
	//按后缀名过滤
	try (Stream<Path> paths = Files.walk(Paths.get(dirName), 2)) {
	    paths.map(path -> path.toString()).filter(f -> f.endsWith(".png"))
	            .forEach(System.out::println);
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值