关于JAVA中File的递归问题合集

关于JAVA中File的递归问题合集

在Java中关于File的问题大致有文件的删除(文件夹的删除)、文件的复制(文件夹的复制)等,这两大类的问题大多都涉及到了递归算法的使用。接下来就分享下File中关于递归的问题,话不多说,上硬菜!!!

问题1:从键盘接收一个文件夹路径,统计该文件夹大小
  • 分析:从键盘接收一个文件夹路径
  • 1、创建键盘输入对象
  • 2、定义一个无限循环
  • 3、将键盘录入的结果存储并封装成File对象
  • 4、对File对象进行判断
  • 5、将文件夹路径返回

  • 分析:统计文件夹大小
  • 1、定义一个求和变量
  • 2、获取该文件夹下的所有文件和文件夹listFiles[]
  • 3、遍历数组
  • 4、判断是文件就计算大小并累加
  • 5、判断是文件夹,就调用递归
import java.io.File;
import java.util.Scanner;

public class Test01 {
	public static void main(String[] args) {
		System.out.println("该文件夹大小为:"+getDirLength(getDir()));	
	}
	//从键盘接收一个文件夹路径
	public static File getDir() {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个文件夹路径:");
		while (true) {
			String line = scanner.nextLine();
			File file = new File(line);
			if (!file.exists()) {
				System.out.println("你输入的文件夹不存在,请重新输入一个文件夹路径:");
			}else if (file.isFile()) {
				System.out.println("你输入的是一个文件路径,请重新输入一个文件夹路径:");
			}else {
				return file;	
			}
			scanner.close();
		}
		
		
	}
	//统计文件夹大小
	public static long  getDirLength(File file) {
		long length=0;
		File[] listFiles = file.listFiles();
		for (File subfile : listFiles) {
			if (subfile.isFile()) {
				length+=subfile.length();
			}else {
				length+=getDirLength(subfile);
			}
		}
		return length;
	}

}
问题2: 从键盘接收一个文件夹路径,删除该文件夹
  • 从键盘接收一个文件夹路径的方法请查看问题1中的getDir()方法
  • 分析:删除文件夹
  • 1、获取该文件夹下的所有文件和文件夹
  • 2、遍历数组
  • 3、判断是文件就直接删除
  • 4、如果是文件夹,调用递归
  • 5、循环结束后,把空文件夹删除
import java.io.File;

public class Test02 {
	public static void main(String[] args) {
		File dir = Test01.getDir();
		deleteDir(dir);
	}
	public static void deleteDir(File file) {
		File[] listFiles = file.listFiles();
		for (File subFile : listFiles) {
			if (subFile.isFile()) {
				subFile.delete();
			}else {
				deleteDir(subFile);
			}
		}
		file.delete();
	}

}
问题3:将一个文件夹拷贝至另一个文件夹
  • 分析:
  • 1、在目标文件夹中创建源文件夹
  • 2、获取源文件夹中所有的文件和文件夹,存储在File数组中
  • 3、遍历数组
  • 4、如果是文件,就使用IO流进行读写
  • 5、如果是文件夹就调用递归
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class Test05 {
	public static void main(String[] args) throws Exception {
		File src = getDir();
		File dest = getDir();
		copyDir(src, dest);
	}
	public static File getDir() {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个文件夹路径");
		String line = scanner.nextLine();
		File file = new File(line);
		while (true) {
			if (!file.exists()) {
				System.out.println("你输入的文件夹路径不存在,请重新输入:");
			}else if (file.isFile()) {
				System.out.println("你输入的是文件路径,请重新输入一个文件夹路径:");
			}else {
				return file;
			}
			scanner.close();
		}
	}
	
	public static void copyDir(File src,File dest) throws Exception {
		File newdir =new File(dest, src.getName());
		newdir.mkdir();
		File[] subFiles = src.listFiles();
		for (int i = 0; i < subFiles.length; i++) {
			if (subFiles[i].isFile()) {
				FileInputStream fileInputStream = new FileInputStream(subFiles[i]);
				FileOutputStream fileOutputStream = new FileOutputStream(new File(newdir, subFiles[i].getName()));
				int len = 0;
				while ((len=fileInputStream.read())!=-1) {
					fileOutputStream.write(len);
				}
				fileInputStream.close();
				fileOutputStream.close();
			}else {
				copyDir(subFiles[i], newdir);
			}
		}	
	}
}

经典的递归算法
斐波拉契数列

示例: 0 ,1,1,2,3,5,8,13,21…
从数列可以观察到,r如果我们把这个数列看成是一个数组array,那么array[0] = 0; array[1]=1; array[2]=1; array[3] = 2 …array[8] =21;从第3项开始,第n项是(n-1)项和(n-2)项之和。
问题:设计一个方法,打印出斐波拉契数列中的第n个数

public class Test11 {
	public static void main(String[] args) {
		System.out.println(fibonacci(5));
	}
	public static int fibonacci(int n) {
		if (n<0) {
			return -1;
		}else if (n==0||n==1) {
			return n;
		}else {
			return fibonacci(n-1)+fibonacci(n-2);
		}
	}
}
关于n!问题

n!=n*(n-1)* (n-2)…3* 2 *1
n!=n * (n-1)!
从上面两个n!计算的式子可以很明显的发现计算n!是一个很典型的递归过程。

public class Test10 {
	public static void main(String[] args) {
		System.out.println(factorial(5));
	}
	public static int factorial(int n) {
		if (n<0) {
			return -1;
		}else if (n==0||n==1) {
			return n;
		}else {
			return n*factorial(n-1);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值