JavaSE-File类、递归

目录

[TOC]

第一章:File类

1.1 File类介绍

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

1.2 构造方法

  • 语法

    1. public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    2. public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
    3. public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
  • 代码

        // 创建File对象-方式1
        File file1 = new File("D:\\JavaCode\\BasicCode\\a");
        System.out.println(file1);
        // 创建File对象-方式2
        File file2 = new File("D:\\JavaCode\\BasicCode\\a","1.txt");
        System.out.println(file2);
        // 创建File对象-方式3
        File file3 = new File(file1,"1.txt");
        System.out.println(file3);
    
  • 注意事项

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

1.3 File类静态成员

  • 静态成员

    1. public static final String pathSeparator
      • 与系统有关的路径分隔符。
    2. public static final String separator
      • 获取与系统有关的默认名称分隔符。
  • 代码

        System.out.println(File.pathSeparator);  // ";"
        System.out.println(File.separator); // "/"
      // 注意:不同的操作系统获取的分隔符是不一样的
    

1.4 常用方法

  1. 获取功能-相关方法

    • 方法

      1. public String getAbsolutePath():返回此File的绝对路径名字符串。
      2. public String getPath() :将此File转换为路径名字符串。
      3. public String getName():返回由此File表示的文件或目录的名称。
      4. public long length():返回由此File表示的文件的长度。
    • 代码

        public static void main(String[] args) {
          // 1. `public String getAbsolutePath() `:返回此File的绝对路径名字符串。
          show1();
          // 2. `public String getPath()` :将此File转换为路径名字符串。
          show2();
          // 3. `public String getName() `:返回由此File表示的文件或目录的名称。
          show3();
          // 4. `public long length() `:返回由此File表示的文件的长度(文件的大小)
          show4();
        }
      
        private static void show4() {
          // 不存在的文件夹或不存在的文件或存在的文件夹返回的都是0
          File file1 = new File("D:\\JavaCode\\BasicCode\\a");
          System.out.println(file1.length()); // 0
          File file3 = new File("D:\\JavaCode\\BasicCode\\aa");
          System.out.println(file3.length()); //0
          File file2 = new File("D:\\JavaCode\\BasicCode\\a\\logo01.png");
          System.out.println(file2.length()); //11610 字节
        }
      
        private static void show3() {
          File file1 = new File("D:\\JavaCode\\BasicCode\\a");
          System.out.println(file1.getName()); // a
          File file2 = new File("1.txt");   // 1.txt
          System.out.println(file2.getName());
        }
      
        private static void show2() {
          // 文件路径是什么就返回什么
          File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt");
          System.out.println(file1.getPath()); // D:\JavaCode\BasicCode\1.txt
          File file2 = new File("1.txt");   // 1.txt
          System.out.println(file2.getPath());
        }
      
        private static void show1() {
          File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt");
          System.out.println(file1.getAbsoluteFile()); // D:\JavaCode\BasicCode\1.txt
          File file2 = new File("1.txt");   // D:\JavaCode\BasicCode\1.txt
          System.out.println(file2.getAbsoluteFile());
        }
      
  2. 绝对路径和相对路径

    • 绝对路径:从盘符开始的路径,这是一个完整的路径。
    • 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
  3. 判断功能-相关方法

    • 方法

      1. public boolean exists() :此File表示的文件或目录是否实际存在。
      2. public boolean isDirectory() :此File表示的是否为目录(目录实际存在)。
      3. public boolean isFile() :此File表示的是否为文件(文件实际存在)。
    • 代码

          File file1 = new File("a");
          // 1. `public boolean exists()` :此File表示的文件或目录是否实际存在。
          System.out.println(file1.exists());  // true
          // 2. `public boolean isDirectory()` :此File表示的是否为目录。
          System.out.println(file1.isDirectory()); // true
          // 3. `public boolean isFile()` :此File表示的是否为文件。
          System.out.println(file1.isFile());  // false
      
  4. 创建删除功能-相关方法

    • 方法

      1. public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
      2. public boolean delete():删除由此File表示的文件或目录。
      3. public boolean mkdir() :创建由此File表示的目录。
      4. public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。
    • 代码

        public static void main(String[] args) throws IOException {
          // 1. `public boolean createNewFile()` :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
          File file1 = new File("a"); // 已经存在的文件目录
          System.out.println(file1.createNewFile()); // false
          File file2 = new File("b"); // 不存在的文件
          System.out.println(file2.createNewFile()); // true
          // 2. `public boolean delete() `:删除由此File表示的文件或目录。
          File file3 = new File("c"); // 不存在的文件
          System.out.println(file3.delete()); // false
          File file4 = new File("b"); // 不存在的文件
          System.out.println(file4.delete()); // true
          // 3. `public boolean mkdir()` :创建由此File表示的目录。
          File file5 = new File("e"); // 不存在的文件目录
          System.out.println(file5.mkdir()); // true
          File file6 = new File("e//g/f"); // 多级文件目录
          System.out.println(file6.mkdir()); // false
          // 4. `public boolean mkdirs() `:创建由此File表示的目录,包括任何必需但不存在的父目录。
          System.out.println(file6.mkdirs()); // true
      
        }
      

1.5 目录的遍历

  • 方法

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

        // 1. `public String[] list()` :返回一个String数组,表示该File目录中的所有子文件或目录。
        File file1 = new File("D:\\JavaCode\\BasicCode");
        String[]files = file1.list();
        for (int i = 0; i < files.length; i++) {
          System.out.println(files[i]);
        }
        //2. `public File[] listFiles()` :返回一个File数组,表示该File目录中的所有的子文件或目录。
        File file2 = new File("D:\\JavaCode\\BasicCode");
        File[]files2 = file2.listFiles();
        for (int i = 0; i < files2.length; i++) {
          System.out.println(files2[i]);
        }
    
  • 注意事项

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

第二章:递归

2.1 递归介绍

  • 递归,函数自身调用自身的编程技巧。
  • 递归的分类:
    • 直接递归称为方法自身调用自己。
    • 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
  • 递归注意事项:
    1. 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
    2. 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
    3. 构造方法,禁止递归

2.2 递归练习1

  • 需求:计算数字1 ~ n的和

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

  • 代码:

      // 计算数字1 ~ n的和
      public static void main(String[] args) {
        int sum = getSum(3);
        System.out.println(sum);
      }
    
      private static int getSum(int n) {
        // 判断递归结束条件
        if(n==1) {
          return 1;
        }
        // 递归任务
        return n + getSum(n-1);
      }
    
    
  • 图解:

2.3 递归练习2

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

    • n的阶乘:n! = n * (n‐1) *...* 3 * 2 * 1 x
  • 分析:这与累和类似,只不过换成了乘法运算

    • 推理得出:n! = n * (n‐1)!
  • 代码

      public static void main(String[] args) {
        int result = factorial(3);
        System.out.println(result);
      }
    
      private static int factorial(int n) {
        if(n==1) {
          return 1;
        }
        return n * factorial(n-1);
      }
    

2.4 递归练习3

  • 需求:打印多级目录及文件

  • 代码:

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode\\dir");
        readFile(file);
      }
      // 定义读取目录文件的方法
      private static void readFile(File file) {
       // 获取子文件和子目录
        File[]files = file.listFiles();
        // 循环遍历子文件和子目录
        for (File f : files) {
          if(f.isDirectory()){
            readFile(f);
          }else {
            System.out.println(f);
          }
        }
      }
    

2.5 递归练习4

  • 需求: 给一个指定的目录,递归实现过滤出该目录中所有的以及嵌套目中.java文件

  • 代码:

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定义读取目录文件的方法
      private static void readFile(File file) {
        // 获取子文件和子目录
        File[]files = file.listFiles();
        // 循环遍历子文件和子目录
        for (File f : files) {
          if(f.isDirectory()){
            readFile(f);
          }else {
            if(f.getName().toLowerCase().endsWith(".java")){
              System.out.println(f);
            }
          }
        }
      }
    

2.6 文件过滤器

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

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

  • 需求:和上述练习4一样

  • 分析

    1. 接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。

    2. accept 方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回 false。保留规则:

      1. 要么是.java文件。
      2. 要么是目录,用于继续遍历。
    3. 通过过滤器的作用, listFiles(FileFilter) 返回的数组元素中,子文件对象都是符合条件的,可以直接打

      印。

  • 代码1:匿名内部类

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定义读取目录文件的方法
      private static void readFile(File file) {
        // 获取子文件和子目录
        File[]files = file.listFiles(new FileFilter() {
          @Override
          public boolean accept(File pathname) {
            // 符合条件的File
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
          }
        });
        // 循环遍历子文件和子目录
        for (File f : files) {
          if(f.isFile()){
            System.out.println(f);
          }else {
            readFile(f);
          }
        }
      }
    
  • 代码2:Lambda表达式

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定义读取目录文件的方法
      private static void readFile(File file) {
        // 获取子文件和子目录
        File[]files = file.listFiles(pathname -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));
        // 循环遍历子文件和子目录
        for (File f : files) {
          if(f.isFile()){
            System.out.println(f);
          }else {
            readFile(f);
          }
        }
      }
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容