JAVA--递归

目录

小练习示例

案例:遍历目录

需求

思路

编码

案例:删除目录

案例:查找java文件并存储到文本文件中

需求

思路

编码


函数自身调用自身,这种表现形式,或者编程方式,称为递归

递归注意事项

1.限定条件。

2.要注意递归的次数,尽量避免内存溢出。

小练习示例

import java.io.*;
class FileDemo3{
	
	public static void main(String[] args)throws IOException{
		
		int n=getSum(6);
		System.out.println(n);
		toBin(6);
	}
	// 递归小练习,求1至某个int类型数值之间所有整数之和
	public static int getSum(int n){
		if(n==1)
			return 1;
		return n+getSum(n-1);
	}
	// 递归小练习,求int类型二进制数
	public static void toBin(int num){
		if(num>0){
			toBin(num/2);
			System.out.println(num%2);
		}
	}
}

案例:遍历目录

需求

列出指定目录下文件或者文件夹,包含子目录中的内容。也就是列出指定目录下所有内容。

思路

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。

在列出过程中出现的还是目录的话,还可以再次调用本共功能。

即使用递归完成本项练习

编码

import java.io.*;
class FileDemo3{
	
	public static void main(String[] args)throws IOException{
		File f=new File("F:\\知识充电\\工作Study\\SumStudy\\CSDN\\未上传\\IO");
		// showDir(f); 
		showDir(f,0); // 从0级开始遍历
	}
	
	// 添加目录层级展示
	public static String getLevel(int level){
		StringBuilder sb=new StringBuilder();
		sb.append("|--");
		for(int x=0;x<level;x++){
			sb.insert(0,"|  ");
		}
		return sb.toString();
	}
	// 遍历带层级目录和文件
	public static void showDir(File dir,int level){
		System.out.println(getLevel(level)+dir.getName());
		
		level++;
		File[] files=dir.listFiles();
		for(int x=0;x<files.length;x++){
			if(files[x].exists()){
				if(files[x].isDirectory())
					showDir(files[x],level);
				else
					System.out.println(getLevel(level)+files[x]);
			}
		}
	}
	// 遍历目录和文件
	public static void showDir(File dir){
		System.out.println(dir);	// 打印目录

		File[] files=dir.listFiles();
		for(int x=0;x<files.length;x++){
			if(files[x].exists()){
				if(files[x].isDirectory())
					showDir(files[x]);
				else
					System.out.println(files[x]);	// 打印文件
			}
		}
	}
}

案例:删除目录

删除原理:在Windows中,删除目录是从里面往外删除,既然是从里往外删除,就需要用到递归。

import java.io.*;
class RemoveDir{
	
	public static void main(String[] args)throws IOException{
		File f=new File("F:\\IO");
		removeDir(f);
	}
	// 删除目录原理
	public static void removeDir(File dir){
		File[] files=dir.listFiles();
		for(int x=0;x<files.length;x++){
			if(files[x].exists()){
				if(files[x].isDirectory())
					removeDir(files[x]);
				
				System.out.println(files[x].toString()+":-file-:"+files[x].delete());	// 删除文件
			}
		}
		
		System.out.println(dir+"::dir::"+dir.delete());	// 删除目录
	}
}

案例:查找java文件并存储到文本文件中

需求

    将一个指定目录下的java文件的绝对路径,存储到一个文本文件中,建立一个java文件列表文件。

思路

1.对指定的目录进行递归。

2.获取递归过程所有的java文件的路径。

3.将这些路径存储到集合中。

4.将集合中的数据写入到一个文件中。

编码

import java.io.*;
import java.util.*;
class JavaFileList{
	
	public static void main(String[] args)throws IOException{
		File dir=new File("F:\\IO");
		
		List<File> list=new ArrayList<File>();
		fileToList(dir,list);
		
		// System.out.println(list.size());
		
		File file=new File(dir,"javalist.txt");
		writeToFile(list,file.toString());
	}
	// 获取.java文件并添加到集合中
	public static void fileToList(File dir,List<File> list){
		File[] files=dir.listFiles();
		for(File file:files){
			if(file.isDirectory())
				fileToList(file,list);
			else{
				if(file.getName().endsWith(".java"))
					list.add(file);
			}
				
		}
	}
	// 将获取到的.java文件的绝对路径写入到指定文件中
	public static void writeToFile(List<File> list,String javaListFile)throws IOException{
		BufferedWriter bufw=null;
		try{
			bufw=new BufferedWriter(new FileWriter(javaListFile));
			
			for(File file:list){
				String path=file.getAbsolutePath();
				bufw.write(path);
				bufw.newLine();
				bufw.flush();
			}
			
		}catch(IOException ex){
			throw ex;
		}finally{
			try{
				if(bufw!=null)
					bufw.close();
			}catch(IOException e){
				throw e;
			}
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值