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

 

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

package com.jorian.text.httpClient;

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


/**
	 * 创建一个给定路径下的文件
	 *
	 */
public class creatFolder{
	//定义 地址,文件名
	private String path=null;
	private String foldername=null;


	//测试代码
	public static void main(String[] args){

		creatFolder cf=new creatFolder("d:\\","jorian.txt");
		cf.creat();
		}

	//定义构造方法
	public creatFolder(String path,String foldername) {
		this.path=path;
		this.foldername=foldername;}
	//定义创造方法
	public void creat(){
		File file=new File(path,foldername);
		file.mkdirs();
		}
	}

二. 递归手法学习

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

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

package com.jorian.text.httpClient;

import java.io.File;
public class FileReadDeapth{
	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,直到为1,求和  
	 * @param num
	 * @return
	 */
	public static int getNum(int num) {
		if(num==1){
			return 1;
		}
		return num+getNum(num-1);
		//递归
		//System.out.println(num);
	}

	/**
	 * 将10进制转为2进制
	 * @param num
	 */
	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 com.jorian.text.httpClient;

import java.io.File;

/**
	 * 需求:对指定的目录进行所有内容的列出(包含子目录中的内容)
	 * 也可以理解为深度遍历目录
	 *
	 */
public class FileReadDeapth {
	//执行程序
	public static void main(String[] args) {
		//指定起始目录
		File dir=new File("D://jorian//JT课件//代码+word");
		listAllDir(dir,0);
	}
	/**
	 * 
	 * @param dir   起始目录
	 * @param level 当前层级
	 */
	public static void listAllDir(File dir,int level) {

		System.out.println(getSpace(level)+"|-->"+dir.getName());
		//1级下边的所有文件及文件夹
		level++;
		File []files =dir.listFiles();

		//遍历每一个文件或文件夹
		for(int i = 0;i<files.length;i++){
			//判断是不是文件夹,是文件夹,那就再次调用这个方法,展现下一层文件,自己调用自己方法,把这种编程手法叫做递归
			if(files[i].isDirectory()){
				listAllDir(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();
	}


}

 

四.递归练习,模拟win系统删除文件的原理 


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

package com.jorian.text.httpClient;

import java.io.File;



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


public class DeleteFile {
	/**************
 * 删除一个带内容的目录
 * 
 *    原理:必须从里边往外边删
 *    	需要进行深度遍历
 * */

	public DeleteFile() {
		// TODO Auto-generated constructor stub
	}

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

	/**
	 * 
	 * @param 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());//删除文件夹,注意!采用递归手法,先删除的是最里层的文件夹
	}

}





猜你喜欢

转载自blog.csdn.net/weixin_38023579/article/details/71577024
今日推荐