Java的文件类File和递归(笔试的常见题)

File类

其构造函数有四个,最后一个传入URI的

  • File(String pathname):根据一个路径得到File对象
  • File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
  • File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象

一道题说明File过滤器

如何 实现 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称(注意以下代码只是返回文件名,并不是操作文件.)

方法有两种….

    /*  1, 没有使用过滤器的  */
        File dir = new File("E:\\");

        String[] filename = dir.list();

        for (String name : filename) {
            if(name.endsWith(".jpg")){
                System.out.println(name);
            }
        }
        /*  2, 使用过滤器版本的操作.*/
        File dir = new File("E:\\");
        String[] filename = dir.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
//              System.out.println(dir);
//              System.out.println(name);
    //当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false
                return name.endsWith(".jpg")?true:false;
            }
        });
        for (String name : filename) {
            System.out.println(name);
        }

File类(递归)

  • 5的阶乘
  • 递归调用的弊端:不能调用的次数过多(7000次左右),容易导致栈内存溢出
  • 递归调用的好处:不用知道循环的次数
  • 构造方法是不可使用递归的。
  • 递归不一定需要返回值(类似文件夹查找不需要返回值)

File类(练习)

  • 需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
    分析:
    • 从键盘接收一个文件夹路径
    • 1,如果录入的是不存在,给与提示
    • 2,如果录入的是文件路径,给与提示
    • 3,如果是文件夹路径,直接返回

      • 打印出该文件夹下所有的.java文件名
    • 1,获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中
    • 2,遍历数组,对每一个文件或文件夹做判断
    • 3,如果是文件,并且后缀是.java的,就打印
    • 4,如果是文件夹,就递归调用

实例1、

获取一个文本上每个字符出现的次数,将结果写在times.txt上
*
* 分析:
* 1,创建带缓冲的输入流对象
* 2,创建双列集合对象TreeMap
* 3,将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将该键和值加1存储
* 4,关闭输入流
* 5,创建输出流对象
* 6,遍历集合将集合中的内容写到times.txt中
* 7,关闭输出流

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

  • 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小
    逻辑思路:
    从键盘接收一个文件夹路径

    • 1,创建键盘录入对象
    • 2,定义一个无限循环
    • 3,将键盘录入的结果存储并封装成File对象
    • 4,对File对象判断
    • 5,将文件夹路径对象返回

      统计该文件夹大小

    • 1,定义一个求和变量
    • 2,获取该文件夹下所有的文件和文件夹listFiles();
    • 3,遍历数组
    • 4,判断是文件就计算大小并累加
    • 5,判断是文件夹,递归调用

File类递归练习(删除该文件夹)

  • 需求:2,从键盘接收一个文件夹路径,删除该文件夹
    删除该文件夹
    分析:
    • 1,获取该文件夹下的所有的文件和文件夹
    • 2,遍历数组
    • 3,判断是文件直接删除
    • 4,如果是文件夹,递归调用
    • 5,循环结束后,把空文件夹删掉

File类递归练习(拷贝)

  • 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
    把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
    分析:
    • 1,在目标文件夹中创建原文件夹
    • 2,获取原文件夹中所有的文件和文件夹,存储在File数组中
    • 3,遍历数组
    • 4,如果是文件就用io流读写
    • 5,如果是文件夹就递归调用

File类递归练习(按层级打印)那个lev值++lev和lev++都是效果不同的,因为递归调用时不需要改变原来的lev

  • 需求: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
    

分析:
* 1,获取所有文件和文件夹,返回的File数组
* 2,遍历数组
* 3,无论是文件还是文件夹,都需要直接打印
* 4,如果是文件夹,递归调用

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

  • 不死神兔
  • 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
  • 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡,
  • 问:一对刚出生的兔子,一年内繁殖成多少对兔子?
  • 1 1 2 3 5 8 13
  • 第一个月一对小兔子 1
  • 第二个月一对大兔子 1
  • 第三个月一对大兔子生了一对小兔子 2
  • 第四个月一对大兔子生了一对小兔子
  • 一对小兔子长成大兔子 3
  • 第五个月两对大兔子生两对小兔子
  • 一对小兔子长成大兔子 5

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

  • 需求:求出1000的阶乘所有零和尾部零的个数,不用递归做

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

  • 需求:求出1000的阶乘尾部零的个数,用递归做

约瑟夫环(笔试题)

  • 幸运数字
    /*
     * 获取幸运数字
     * 1,返回值类型int
     * 2,参数列表int num
     */
    public static int getLucklyNum(int num) {
    //创建集合存储1到num的对象
        ArrayList<Integer> list = new ArrayList<>();
        //将1到num存储在集合中      
        for(int i = 1; i <= num; i++) {
            list.add(i);                                    
        }
        //用来数数的,只要是3的倍数就杀人
        int count = 1;  
        //只要集合中人数超过1,就要不断的杀                                 
        for(int i = 0; list.size() != 1; i++) {             
            //如果i增长到集合最大的索引+1时
            if(i == list.size()) {                          
                i = 0;  //重新归零                                  
            }
            //如果是3的倍数
            if(count % 3 == 0) {
            //就杀人,此处的关键是i--将其游标拉回一个位置                           
                list.remove(i--);                           
            }
            count++;//不断的点数
        }

        return list.get(0);
    }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值