Java 通过递归实现简单的文件搜索

本文介绍了一个使用Java实现的文件搜索算法,该算法能够递归地遍历指定目录下的所有文件,寻找特定名称或类型的文件,并返回所有匹配的文件对象。通过实际测试案例,展示了如何在复杂目录结构中定位目标文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:

传入文件名(或者文件类型),和要查找的文件目录,使用递归遍历此文件目录下的所有文件,找到该文件对象并输出

如果没有找到则输出未找到

 

直接上代码

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class SearchFile {

    public static List<File> searchResult = new ArrayList<>();//存储查询结果

    public static void main(String[] args) {
        //进行测试
        searchFilesByname("D:\\JAVA\\FileTest","a.txt");
        searchFilesByname("D:\\JAVA\\FileTest","txt");
        searchFilesByname("D:\\JAVA\\FileTest","java");
        searchFilesByname("D:\\JAVA\\FileTest","xt");
    }

    public static void searchFilesByname(String directoryPath,String searchFileName){

        List<File> getResult = getFiles(new File(directoryPath),searchFileName);//获取查询结果

        System.out.println("-----------------------搜索结果-----------------");
        if(getResult.isEmpty()){
            System.out.println(searchFileName+"的搜作结果:在"+directoryPath+"路径下未找到此文件");
        }else{
            System.out.println(searchFileName+"找到了"+getResult.size()+"个结果:");
           for(int i=0;i<getResult.size();i++){
               System.out.println(getResult.get(i));//遍历输出查询结果
           }
        }

        //执行完成清空List结果集
        searchResult.clear();
    }

    public static List<File> getFiles(File file, String filename){
        for(File f : file.listFiles()){
            if(f.isDirectory()){//如果该对象是目录,则递归进入该目录继续搜索遍历
                getFiles(f,filename);
            }
            else{ //不是目录则进行匹配操作
                if(f.getName().endsWith(filename)){ //endWith匹配字符串尾部,这里匹配的是所有文件名尾部
                    searchResult.add(f);
                }
            }
        }
        return searchResult;
    }
}

我在D:\JAVA\FileTest的目录结构如下:

D:\JAVA\FILETEST

│ 测试.txt

└─测试文件夹

└─测试文件夹的子文件夹

a.txt

 

程序输出结果:

 

 

/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值