欢迎光临散文网 会员登陆 & 注册

java递归打印目录树

2022-07-14 17:28 作者:虚云幻仙  | 我要投稿

/**
* 通过递归创建/打印目录树
*/

public class TestFile2 {
   public static boolean createDirOrFile(File f,boolean file){
       if (file){
           if (f.isFile()){
               return false;
               //如果路径已存在 返回false创建操作未执行
           }
           File upper = f.getParentFile();
           if (upper.isDirectory()){
               //如果父目录存在则创建该文件
               try {
                   f.createNewFile();
               } catch (IOException e) {
                   throw new RuntimeException(e);
               }
               return true;
           }
           createDir(upper);
           //如果不存在父目录则调用 createDir()方法创建父目录 之后再创建文件
           try {
               f.createNewFile();
           } catch (IOException e) {
               throw new RuntimeException(e);
           }
           return true;
       }

       //如果想创建的不是文件 file为false 即创建目录
       //下面的语句不需要else括起来 如果file为true执行完上面语句已经return了不会向下执行

       if (f.isDirectory()){
           //判断目标目录是否存在
           return false;
       }
       File upper = f.getParentFile();
       if (upper.isDirectory()){
           f.mkdir();
           return true;
       }
       createDir(upper);
       //同样判断父目录是否存在 存在即创建f目录 不存在则创建父目录之后再创建f
       f.mkdir();
       return true;
   }

   private static void createDir(File dir){
       //该方法为类的方法static在类内部进行调用 不需要供外部使用 所以private 内部使用不需要查看结果 所以void
       //因为createDirOrFile()方法内已经判定目录dir不存在了 这里不需要再次判断

       File upperDir = dir.getParentFile();
       if (upperDir.isDirectory()){
           //判断这一层目录的父目录是否存在
           //.exists()无法区分目录和文件 只要路径一致都会true

           dir.mkdir();
       }else{
           createDir(upperDir);
           //递归 如果父目录不存在则调用本方法创建父目录的父目录 如果还不存在则再往上一层创建 直到某一层判断父目录存在后创建子目录结束方法 前一层createDir()才继续向下进行
           dir.mkdir();
       }
   }
   public static void main(String[] args) {
       File mp4 = new File("C:/abc/def/ghi/m.mp4");
       System.out.println(createDirOrFile(mp4,true));
       for (int i =1;i<5;i++){
           createDirOrFile(new File("C:/abc/def/p"+i+".jpg"),true);
       }

   }
}

class TestFile3{
   public static void printFileList(File f){
       //打印文件/目录树
       if (!f.exists()){
           System.out.println("目标不存在");
       }else {
           printFileList(f,0);
       }
   }
   private static void printFileList(File f,int n){
       //private私有 外部通过printFileList(File f)调用 免得传n=0
       for (int i = 0;i<n;i++){
           System.out.print("-");
           //用n来区分目录树的层级 每深入一层就多打印一个 "-"
       }
       System.out.println(f.getName());
       File[] subList = f.listFiles();
       //.listFiles() 如果f的路径 denote象征 一个目录 则返回包含该目录下所有文件的File[]数组 如果f不是目录则返回null 如果是空目录则返回File[0]
       if (subList != null){
           for (File subListFile:subList){
               //for-each循环
               printFileList(subListFile,n+1);
               //递归 每深入一层都使n++ 下一层同样经过打印文件名、判断是否目录、是目录再深入一层 直到某一层是文件不执行printFileList方法并结束这一层
           }
       }

   }

   public static void main(String[] args) {
       printFileList(new File("C:/abc"));
   }

   public static void printDirAndMp4(File f,int n){
       if (f.isDirectory()||f.getName().toLowerCase().endsWith(".mp4")){
           //忽略大小写 先全部变为小写 再匹配.mp4
           for (int i = 0;i<n;i++){
               System.out.print("-");
           }
           System.out.println(f.getName());
       }
       //如果不是目录或者mp4则不打印
       File[] subList = f.listFiles();
       //.listFiles()返回数组File[]
       if (subList != null){
           for (File subListFile:subList){
               //遍历子目录
               printDirAndMp4(subListFile,n+1);
               //递归 逐层递进打印所有目录和mp4
           }
       }
   }

   public static void printJpgOnly(File f){
       if (f.isDirectory()){
           File[] subList = f.listFiles();
           if (subList != null){
               for (File subListFile:subList){
                   printJpgOnly(subListFile);
                   //递归
               }
           }
       } else if (f.getName().toLowerCase().endsWith(".jpg")) {
           //.endsWith() 路径字符串以.jpg结尾 即为jpg文件
           System.out.println(f.getPath());
       }
       //如果既不是目录也不是jpg文件 跳过if和elif语句块结束方法
   }
}

java递归打印目录树的评论 (共 条)

分享到微博请遵守国家法律