关于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);
}
}
}