• 文件之file类(一)


    前言

    目标:

      能够说出File对象的创建方式
      能够说出File类获取名称的方法名称
      能够说出File类获取绝对路径的方法名称
      能够说出File类获取文件大小的方法名称
      能够说出File类判断是否是文件的方法名称
      能够说出File类判断是否是文件夹的方法名称
      能够辨别相对路径和绝对路径
      能够遍历文件夹
      能够解释递归的含义
      能够使用递归的方式计算5的阶乘
      能够说出使用递归会内存溢出隐患的原因

    File类

    1.1 概述

      java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

    1.2 构造方法

      public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

      public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。

      public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

      构造举例,代码如下:

    小贴士:

    1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
    2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建

    1.3 常用方法

     获取功能的方法

        public String getAbsolutePath() :返回此File的绝对路径名字符串

        public String getPath() :将此File转换为路径名字符串

        public String getName() :返回由此File表示的文件或目录的名称

        public long length() :返回由此File表示的文件的长度(大小)。

    示例:

    绝对路径和相对路径

    • 绝对路径:从盘符开始的路径,这是一个完整的路径。
    • 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。

    判断功能的方法

      public boolean exists() :此File表示的文件或目录是否实际存在
      public boolean isDirectory() :此File表示的是否为目录
      public boolean isFile() :此File表示的是否为文件
      方法演示,代码如下:

    创建删除功能的方法

      public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件
      public boolean delete() :删除由此File表示的文件或目录。
      public boolean mkdir() :创建由此File表示的目录。()(创建单级目录
      public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(创建多级目录
      方法演示,代码如下:

    注意:

      API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。

    1.4 目录的遍历

    • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录

    • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录

    小贴士:

    调用 list()  和 listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

    第二章 递归

    2.1递归概述

    递归:指在当前方法内调用自己的这种现象。

    递归的分类:

    递归分为两种,直接递归间接递归
      直接递归称为方法自身调用自己。
      间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
    注意事项:

    递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
    在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
    构造方法,禁止递归

    public class Demo01DiGui {
        public static void main(String[] args) {
            // a();
            b(1);
        }
        
        /*
         * 3.构造方法,禁止递归
         * 编译报错:构造方法是创建对象使用的,不能让对象一直创建下去
         */
        public Demo01DiGui() {
            //Demo01DiGui();
        }
    
    
        /*
         * 2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
         * 4993
         *     Exception in thread "main" java.lang.StackOverflowError
         */
        private static void b(int i) {
            System.out.println(i);
            //添加一个递归结束的条件,i==5000的时候结束
            if(i==5000){
                return;//结束方法
            }
            b(++i);
        }
    
        /*
         * 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main"
         * java.lang.StackOverflowError
         */
        private static void a() {
            System.out.println("a方法");
            a();
        }
    }

    2.2 递归累加求和

    计算1 ~ n的和

    分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。

    实现代码:

    public class DiGuiDemo {
        public static void main(String[] args) {
            //计算1~num的和,使用递归完成
            int num = 5;
              // 调用求和的方法
            int sum = getSum(num);
              // 输出结果
            System.out.println(sum);
            
        }
          /*
            通过递归算法实现.
            参数列表:int 
            返回值类型: int 
          */
        public static int getSum(int num) {
              /* 
                 num为1时,方法返回1,
                 相当于是方法的出口,num总有是1的情况
              */
            if(num == 1){
                return 1;
            }
              /*
              num不为1时,方法返回 num +(num-1)的累和
              递归调用getSum方法
            */
            return num + getSum(num-1);
        }
    }

    代码执行图解

    小贴士:递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出

    2.3 递归求阶乘

    • 阶乘:所有小于及等于该数的正整数的积。

     分析:

     代码实现:

    2.4 递归打印多级目录

    分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。

    代码实现:

    public class DiGuiDemo2 {
        public static void main(String[] args) {
              // 创建File对象
            File dir  = new File("D:\aaa");
              // 调用打印目录方法
            printDir(dir);
        }
    
        public static void  printDir(File dir) {
              // 获取子文件和目录
            File[] files = dir.listFiles();
              // 循环打印
              /*
                判断:
                当是文件时,打印绝对路径.
                当是目录时,继续调用打印目录的方法,形成递归调用.
              */
            for (File file : files) {
                // 判断
                if (file.isFile()) {
                      // 是文件,输出文件绝对路径
                    System.out.println("文件名:"+ file.getAbsolutePath());
                } else {
                      // 是目录,输出目录绝对路径
                    System.out.println("目录:"+file.getAbsolutePath());
                      // 继续遍历,调用printDir,形成递归
                    printDir(file);
                }
            }
        }
    }

    3.2 文件过滤器优化


    java.io.FileFilter是一个接口,是File的过滤器。 该接口的对象可以传递给File类的listFiles(FileFilter) 作为参数, 接口中只有一个方法。

    boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true

    分析:

    接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
    accept方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:
    要么是.java文件。
    要么是目录,用于继续遍历。
    通过过滤器的作用,listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印。
    优化查找以什么结尾的文件:代码实现:


    原理:

    3.3 Lambda优化

    分析:FileFilter是只有一个方法的接口,因此可以用lambda表达式简写。

    lambda格式:

     代码实现:

  • 相关阅读:
    【今日CV 视觉论文速览】 19 Nov 2018
    【numpy求和】numpy.sum()求和
    【今日CV 视觉论文速览】16 Nov 2018
    【今日CV 视觉论文速览】15 Nov 2018
    poj 2454 Jersey Politics 随机化
    poj 3318 Matrix Multiplication 随机化算法
    hdu 3400 Line belt 三分法
    poj 3301 Texas Trip 三分法
    poj 2976 Dropping tests 0/1分数规划
    poj 3440 Coin Toss 概率问题
  • 原文地址:https://www.cnblogs.com/JonaLin/p/13058229.html
Copyright © 2020-2023  润新知