Java IO 用递归实现目录删除和树形目录展示 Java实现

用递归实现目录删除和树形目录展示

递归

  所谓递归(Recursion),就是方法调用自身。

  对于递归来说,一定有一个出口,让递归结束。这样才能保证不出现死循环。

  关于递归,比较简单且典型的例子是计算阶乘、计算斐波那契数列等。

  本文是在学习Java的File类时遇到的两个实际问题,一个是文件删除,另一个是将文件目录用树形结构显示(利用缩进),这两个问题都可以用递归解决。

 

解决删除文件的问题

  File类中删除文件或目录的方法是:

  public boolean delete()

  如果要删除的是一个目录,则要求目录必须为空。这在很多时候是不能满足的,那么就需要进入到这个目录中,先将其中所有的子目录和文件都删除;对于其中不为空的子目录,又得继续进行这个过程,所以这是一个递归的过程。

  程序实现如下: 

删除非空目录
import java.io.File;

public class DeleteTest
{
    public static void deleteAll(File file)
    {
        if (file.isFile() || file.list().length == 0)
        {
            // 递归出口:如果file为文件或者空目录,则调用delete方法可以删除
            file.delete();
        }
        else
        {
            // 非空目录不能直接删除

            // 获取待删除目录下的所有File对象
            File[] files = file.listFiles();

            for (File f : files)
            {
                // 删除里面的所有文件及目录
                deleteAll(f);

            }

            // 删除本目录
            file.delete();

        }
    }

    public static void main(String[] args)
    {
        DeleteTest.deleteAll(new File("D://abc"));// 给出待删除的路径
        // 注意:此处删除的文件不会进入回收站,而是直接删除,所以请谨慎
    }

}

 

 

展现树形目录

  给定任意一个目录,以树形方式展现出该目录中的所有子目录和文件,每一层要加上缩进。

展现树形目录
import java.io.File;

public class TreeDirectoryTest
{

    public static int depth = 0;

    public static void deepList(File file)
    {
        if (file.isFile() || 0 == file.list().length)
        {
            if (file.isDirectory())
            {
                // 目录后面加上\表示区分
                System.out.println(getTabs(depth) + file.getName() + "\\");
            }
            else
            {
                System.out.println(getTabs(depth) + file.getName());
            }

            return;

        }
        else
        {
            System.out.println(getTabs(depth) + file.getName() + "\\");
            File[] files = file.listFiles();
            for (File f : files)
            {
                depth++;
                deepList(f);
                depth--;// 保持本层的depth不变
            }

        }

    }

    // 得到合适的缩进
    private static String getTabs(int number)
    {
        StringBuffer tabs = new StringBuffer();
        for (int i = 0; i < number; ++i)
        {
            tabs.append("\t");
        }

        return tabs.toString();
    }

    public static void main(String[] args)
    {
        TreeDirectoryTest.deepList(new File("D:\\Media"));
    }
}

  程序还有很多待完善的地方,比如展示时可以加入排序,将目录排在同级的文件前面。
 

 

参考资料

  圣思园张龙老师Java SE系列视频教程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/** * 根据等级查询类目树 * * @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、付费专栏及课程。

余额充值