javaday49_IO流_深度遍历文件夹,递归手法的使用

时间:2022-12-29 12:26:30

一.创建给定路径下的文件

package java_Studing_day49_IO流_DepthTraversalfolder;


import java.io.File;
import java.io.IOException;


/**
 * 创建给定路径下的文件
 *
 */
public class creatFolder{
//    public static void main(String[] args){
// //测试代码
//       creatFolder cf=new creatFolder("d:\\","weraefafe.txt");
//       cf.creat();
//    }
    /**
     * 地址,文件名
     */
    String path=null;
    String foldername=null;
    
    
    public creatFolder(String path,String foldername) {
this.path=path;
this.foldername=foldername;
    }


   public void creat(){
File file=new File(path,foldername);
file.mkdirs();
    }
    }
 

二.   深度遍历文件夹或者指定目录

package java_Studing_day49_IO流_DepthTraversalfolder;


import java.io.File;


/**
 * 需求:对指定的木进行所有内容的列出(包含子目录中的内容)
 * 也可以理解为深度遍历
 *
 */
public class FileTestDemo {


    /**
     * @param args
     */
    public static void main(String[] args) {


//将指定目录或者文件夹封装成对象
File dir=new File("d:\\sougou");
listAll(dir,0);




  
    }
    
    /****************************深度遍历文件夹或者目录**********************************************************/
    public static void listAll(File dir,int level) {

System.out.println(getSpace(level)+"|-->"+dir.getName());
// //获取指定目录下当前的所有文件夹或者文件对象
level++;
File []files =dir.listFiles();

//遍历每一个文件
for(int i = 0;i<files.length;i++){
  
   
   //判断是不是文件夹,是文件夹,那就再次调用这个方法,自己调用自己方法,把这种编程手法叫做递归
   if(files[i].isDirectory()){
listAll(files[i],level);
   }else
   //不是文件夹就打印出来,加上开始的空挡作为缩进
   System.out.println(getSpace(level)+"|-->"+files[i].getName());
}



    }
//获取层级level个空挡作为缩进,得到类似win7的目录树效果
    private static String getSpace(int level) {
StringBuilder sb=new StringBuilder();
for(int i=0;i<level;i++){
   sb.append("     ");
}
return sb.toString();
    }


}

三,递归手法的学习

package java_Studing_day49_IO流_DepthTraversalfolder;


public class diguiDemo {
/*************
 * 递归:
 * 函数自身直接或者间接的调用到了自身
 * 
 * 什么时候用? 一个功能被重复使用,并每次使用时,参与运算的结果和上一次调用有关
 * 这时可以用递归解决问题

 * 
 * 注意:
 * 1.递归一定要注意条件,否则容易栈溢出
 * 2.注意一下递归的次数
 * 
 * 
 * 
 * */




    public static void main(String[]a ) {
// TODO Auto-generated method stub
     //show();调用show时方法不断的进栈但是不出栈,会发生栈内存溢出的异常
   //toBin(6);
   

int sum =getNum(900000);//要注意递归的次数,否则会发生栈内存溢出异常
   int sum2=getNum(9);
  

 System.out.println(sum);
   System.out.println(sum2);
    }
  

//从某个数开始不断减一,直到为1,求和  
    public static int getNum(int num) {
   if(num==1){
       return 1;
   }
return num+getNum(num-1);//递归
//System.out.println(num);
    
}

//将10进制转为2进制
    public static void toBin(int num){
if (num>0){
   
   System.out.println(num%2);
   toBin( num/2);//将num除以二再调用toBin,递归
}

    }
    
    
  

//    public static void show(){
//
// show();//直接调用自己
// method();//间接的调用自身
//    }
//
//    public  static void method() {
// show();
//
//    }

    

    
}


四.递归手法小练习,  


需求:删除一个带内容的文件夹

package java_Studing_day49_IO流_DepthTraversalfolder;


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;


public class smallPractice {
/**************
 * 删除一个带内容的目录
 * 

 *    原理:必须从里边往外边删
 *    需要进行深度遍历
 * 
 * 
 * */
    
    
 /*********************删除目录的过程******************/  
    public smallPractice() {
// TODO Auto-generated constructor stub
    }


    public static void main(String[] args) throws IOException {
File dir=new File("D:\\demo");
     smallPracticeDemo();
    //removeDir(dir);//递归手法深度遍历文件夹并删除
    }


    public static void removeDir(File dir) {
File [] files=dir.listFiles();//获取文件目录列表
for(File file:files){//深度遍历目录
   if(file.isDirectory()){ //判断没一个目录是否为文件夹
removeDir(file);   //若是文件夹,则继续遍历,递归手法

   }else{  //若不是文件夹

System.out.println(file+":------"+file.delete()); //删除文件,并打印删除结果
   }
   
}
System.out.println(dir+":-----"+dir.delete());//删除文件夹,注意!采用递归手法,先删除的是最里层的文件夹




    }
/**************文件夹的删除顺序探究********************/
    private static void smallPracticeDemo() throws IOException {
// TODO Auto-generated method stub
File dir=new File("d:\\myPractice");
File dir1=new File("d:\\myPractice\\myPractice1");
File dir2=new File("d:\\myPractice\\myPractice2");

File file=new File("d:\\myPractice\\myPractice.txt");
dir.mkdir();
dir1.mkdir();
dir2.mkdir();
//file.createNewFile();
//BufferedWriter bfw=new BufferedWriter(new  FileWriter("F:\\myPractice\\myPractice.txt"));
//bfw.write("sdfwfsdfedsfsefeadfwfa"+System.lineSeparator()+"sdfwefsdfwefsfesfeasdfe");
//bfw.close();
//file.deleteOnExit();
dir1.delete();//先删除里层
dir2.delete();//先删除里层
dir.delete();//不能直接删除外层文件或者文件目录
    }


    
    
    
}