Java学习日志day23(File递归)

    xiaoxiao2025-08-23  12

    2019 . 05.29 23:36

    23.01_File类递归练习(统计该文件夹大小)

    需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 需求:从键盘接收一个文件夹路径,统计文件夹大小 *从键盘接收一个文件夹路径 *1,创建键盘录入对象 *2,定义一个无限循环 *3,将键盘录入结果存储并封装为一个File对象 *4,对File对象判断 *5,将文件夹路径对象返回 *统计文件夹大小 *1,定义一个求和变量 *2,获取文件夹下的所有文件和文件夹listFiles() *3,遍历File数组 *4,判断是文件就计算大小并累加 *5,判断是文件夹,递归调用 ###23.02_File类递归练习(删除该文件夹) package com.heima.test; import java.io.File; import java.util.Scanner; public class File_Size { public static void main(String[] args) { File dir = getDir(); long len = getSize(dir); System.out.println("文件夹的大小为:" + len); } public static File getDir() { //1,创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件夹路径:"); //2,定义一个无限循环 while(true) { //3,将键盘录入结果存储并封装位一个File对象 String line = sc.nextLine(); File dir = new File(line); if(!dir.exists()) { System.out.println("您录入的路径不存在!"); }else if(dir.isFile()) { System.out.println("您录入的是文件路径!"); }else { return dir; } } } public static long getSize(File dir) { //1,定义一个求和变量 long len = 0; //2,获取文件夹下的所有文件和文件夹listFiles() File subFiles[] = dir.listFiles(); //3,遍历File数组 for (File subFile : subFiles) { if(subFile.isFile()) { //4,判断是文件就计算大小并累加 len = len + dir.length(); }else { //5,判断是文件夹,递归调用 len = len + getSize(subFile); } } return len; } } 需求:2,从键盘接收一个文件夹路径,删除该文件夹 需求,从键盘接收一个文件路径,删除文件夹 删除文件夹: 分析:返回类型void 参数列表File dir 1,获取该文件夹下的所有的文件和文件夹 2,遍历文件数组 3,判断是文件就直接删除 4,如果是文件就递归调用 5,循环结束后,把空文件夹删除 package com.heima.test; import java.io.File; /* * 需求,从键盘接收一个文件路径,删除文件夹 * * 删除文件夹: * 分析:返回类型void 参数列表File dir * 1,获取该文件夹下的所有的文件和文件夹 * 2,遍历文件数组 * 3,判断是文件就直接删除 * 4,如果是文件就递归调用 * 5,循环结束后,把空文件夹删除 */ public class test2 { public static void main(String[] args) { File dir = File_Size.getDir(); //获取文件夹路径 deleteFile(dir); } public static void deleteFile(File file) { //1,获取该文件夹下的所有文件和文件夹 File[] subFiles = file.listFiles(); //2,遍历数组 for (File file2 : subFiles) { //3,判断是文件就直接删除 if(file2.isFile()) { file2.delete(); //4,如果是文件就递归调用 }else { deleteFile(file2); } } //5,循环结束后,把空文件夹删除 file.delete(); } }

    23.03_File类递归练习(拷贝)

    需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 package com.heima.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /* 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 从键盘接收两个文件夹路径 1,键盘录入源文件夹路径喝目标文件夹路径(test01中的方法) 2,判断两个文件夹是否相同,相同则违反文件系统规则,不是则调用复制函数 3,获取源文件夹中所有的文件和文件夹 4,将其存储到file数组中 5,遍历数组 6,如果是文件就用io流读写文件(i o流只能读写文件) 7,如果是文件夹就递归调用复制函数 */ public class test03 { public static void main(String[] args) throws IOException { // 1,键盘录入源文件夹路径喝目标文件夹路径(test01中的方法) System.out.println("请输入一个源文件夹路径:"); File src = File_Size.getDir(); System.out.println("请输入一个目标文件夹路径:"); File dest = File_Size.getDir(); if(src.equals(dest)) { System.out.println("源文件夹和目标文件夹一样,输入错误!"); }else { copy(src,dest); } } /* * copy函数:将一个源文件中的所有文件夹和内容拷贝到另外一个文件夹中 1,在目标文件中创建源文件夹 2,获取源文件夹中所有的文件和文件夹,存储在FIle数组中 3,遍历数组 4,如果是文件则进行拷贝,是文件夹则进行递归调用 5, */ private static void copy(File src, File dest) throws IOException { //1,在目标文件中创建源文件夹 File newDir = new File(dest,src.getName()); newDir.mkdir(); //2,获取源文件夹中所有的文件和文件夹,存储在FIle数组中 File[] subFile = src.listFiles(); //3,遍历数组 for (File file : subFile) { //4,如果是文件则进行拷贝 if(file.isFile()) { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(newDir,file.getName()))); int b ; while((b = bis.read())!= -1) { bos.write(b); } bis.close(); bos.close(); //是文件夹则进行递归调用 } else { copy(file,newDir); } } } }

    ###23.04_File类递归练习(按层级打印)

    需求:4,从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如: aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来 aaa bbb.txt ccc.txt ddd.txt

    eee fff.txt ggg.txt package com.heima.test; import java.io.File; /* 需求:从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印 分析: 1,调用text1中的getDir()方法 2,获取文件夹的所有的子文件和文件夹到一个File数组 3,遍历数组,输出元素的路径名字 4,如果是文件夹就递归调用 */ public class test04 { public static void main(String[] args) { // 1,调用text1中的getDir()方法 File dir = File_Size.getDir(); //调用print函数进行打印文件路径名 print(dir,0); } public static void print(File dir,int lev) { //2,获取文件夹的所有的子文件和文件夹到一个File数组 File[] subFiles = dir.listFiles(); // 3,遍历数组,输出元素的路径名字 for (File subfile : subFiles) { for(int i = 0 ; i <= lev; i++) { System.out.print("\t"); } System.out.println(subfile); if(subfile.isDirectory()) { print(subfile, lev+1); } } } }

    结果图:print(subfile, lev+1);

    结果图:print(subfile, lev++); 因为lev++修改了lev 这个变量lev本身

    23.05_递归练习(斐波那契数列)

    不死神兔故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,问:一对刚出生的兔子,一年内繁殖成多少对兔子?1 1 2 3 5 8 13第一个月一对小兔子 1第二个月一对大兔子 1第三个月一对大兔子生了一对小兔子 2第四个月一对大兔子生了一对小兔子 一对小兔子长成大兔子 3 第五个月两对大兔子生两对小兔子 一对小兔子长成大兔子 5 package com.heima.test; import java.util.Scanner; /* 需求:不死神兔:斐波那契数列 数组实现: 1,arr[0] = 1 arr[1] = 1 arr[2] = 2 2,if(i >=2) arr[i] = arr[i-1] + arr[i-2],else arr[i] = 1 递归实现 1,if fun(i) 中 i==1 或者i==2 ,return 1 2,else return fun(i-1) + fun(i-2) */ public class test05 { public static void main(String[] args) { //demo1(); int num; System.out.println("请输入月份:"); Scanner sc = new Scanner(System.in); num = sc.nextInt(); int result = fun(num); System.out.println(result); } public static int fun(int i) { if(i == 1 || i==2) { return 1; }else { return fun(i-1) + fun(i-2); } } private static void demo1() { int[] arr = new int[12]; arr[0] = 1; arr[2] = 1; for(int i = 2 ; i < arr.length; i++) { arr[i] = arr[i-1] + arr[i-2]; } for (int i : arr) { System.out.print(i + " "); } } }

    23.06_递归练习(1000的阶乘所有零和尾部零的个数)

    需求:求出1000的阶乘所有零和尾部零的个数,不用递归做 package com.heima.test; import java.math.BigInteger; /* 需求:求出1000的阶乘所有零和尾部零的个数,不用递归做 1,用int进行递归不行,则会溢出 2,用bigInteger 接收字符串 */ public class test06 { public static void main(String[] args) { demo1(); //阶层的结束是1 BigInteger bi1 = new BigInteger("1"); for(int i = 1; i <= 1000; i++) { BigInteger bi2 = new BigInteger(i + ""); bi1 = bi1.multiply(bi2); } //获取结果的的字符串形式 String s = bi1.toString(); StringBuilder sb = new StringBuilder(s); s = sb.reverse().toString(); int count = 0; for(int i = 0; i < s.length();i++) { if('0'!=s.charAt(i)) break; count++; } System.out.println("count2 = "+ count); } private static void demo1() { //阶层的结束是1 BigInteger bi1 = new BigInteger("1"); for(int i = 1; i <= 1000; i++) { BigInteger bi2 = new BigInteger(i + ""); bi1 = bi1.multiply(bi2); } //获取结果的的字符串形式 String s = bi1.toString(); int count = 0; for(int i = 0; i < s.length();i++) { if('0'==s.charAt(i)) count++; } System.out.println("count1 = "+ count); } }

    23.07_递归练习(1000的阶乘尾部零的个数)

    需求:求出1000的阶乘尾部零的个数,用递归做 package com.heima.test; import java.util.Scanner; /* 需求:求出1000的阶乘尾部零的个数,用递归做 1, 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 ....10000 一个5的倍数乘以一个偶数会出现一个0 1000 / 5 = 200 2, 25 50 75 100 125 150 ... 在这两百个特殊的数上每5个数再乘以一个偶数会出现两个0 200 / 5 = 40 3, 125 250 375 500 625 ... 在这40个特殊数上的每5个数再乘以一个偶数,会出现三个0 40 / 5 = 8 4,625 在这8个特殊数上的每5个数再乘以一个偶数 ,会出现四个0 8 / 5 = 1 设计递归函数:fun 返回值类型:int 参数:整型的 number 1,if number > 0 && number < 5 返回0 结束函数 2,else return number / 5 + fun(number /5) 执行递归调用 */ public class text07 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("please in an Integer betweem 0 to 32767 :"); int number = sc.nextInt(); System.out.println("the number of zero of Integer is :" + fun(number)); } private static int fun(int number) { if(number > 0 && number < 5) { return 0; }else { return number / 5 + fun(number / 5); } } }

    23.08_集合练习(约瑟夫环)

    幸运数字`package com.heima.test;

    import java.util.ArrayList; import java.util.Scanner;

    /*

    约瑟夫杯 : 幸运数字 (让一群人围成一个圈,从第一个人开始数,遇到3的倍数就杀掉一个人,剩下的最后一个人的位置就是幸运数字) 1,返回类型 int 2,参数: 一个 int 参数 3,先根据参数将多个数组添加到list容器中 4,从第一个位置(小标0)开始遍历 for循环 5,遇到3的倍数的位置就删除这个元素,将后续的元素往前移动一位,并将循环变量-1 6,继续数,直到 list中的元素只剩一个就结束循环 7,返回幸运数字 */ public class test08 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print(“please in an Integer betweem 0 to 32767 :”); int number = sc.nextInt(); System.out.println(“the number of ziro of Integer is :” + getLucklyNumber(number)); }

    private static int getLucklyNumber(int number) { ArrayList list = new ArrayList<>(); //创建list对象 for(int i = 1; i <= number; i++) { list.add(i); } int count = 1; for(int i = 0 ; list.size() != 1; i++) { //只要集合中超过两个人就继续杀人 if(i==list.size()) { //实现围成一个圈 i = 0; } if(count % 3 == 0) { list.remove(i–); //将后续元素往前移动一位后要把计数位置往前移动一位 } count ++; } return list.get(0); } } `

    最新回复(0)