• JavaFile类和递归


    八、File类和递归

    8.1 概述

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

    8.2 构造方法

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

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

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

      // 文件路径名
      String pathname = "D:\aaa.txt";
      File file1 = new File(pathname); 
      
      // 文件路径名
      String pathname2 = "D:\aaa\bbb.txt";
      File file2 = new File(pathname2); 
      
      // 通过父路径和子路径字符串
       String parent = "d:\aaa";
       String child = "bbb.txt";
       File file3 = new File(parent, child);
      
      // 通过父级File对象和子路径字符串
      File parentDir = new File("d:\aaa");
      String child = "bbb.txt";
      File file4 = new File(parentDir, child);
       
       
       
      17
       
       
       
       
       
      1
      // 文件路径名
      2
      String pathname = "D:\aaa.txt";
      3
      File file1 = new File(pathname); 
      4
      
      
      5
      // 文件路径名
      6
      String pathname2 = "D:\aaa\bbb.txt";
      7
      File file2 = new File(pathname2); 
      8
      
      
      9
      // 通过父路径和子路径字符串
      10
       String parent = "d:\aaa";
      11
       String child = "bbb.txt";
      12
       File file3 = new File(parent, child);
      13
      
      
      14
      // 通过父级File对象和子路径字符串
      15
      File parentDir = new File("d:\aaa");
      16
      String child = "bbb.txt";
      17
      File file4 = new File(parentDir, child);
       
       
      Tips:
      1.一个File对象 代表硬盘中实际存在的一个文件或目录
      2.无论该路径下是否存在文件或者目录,都不影响File对象的创建

    8.3 获取功能 的方法

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

                  

    • tips:            

    • length() 表示文件的长度 但是 目录的长度未指定

    8.4 判断功能的方法

    • public boolean exists()` :此File表示的文件或目录是否实际存在。

    • public boolean isDirectory() :此File表示的是否为目录。
    • public boolean isFile() :此File表示的是否为文件。 

    notes: 创建的文件对象  必须是真实存在的  才能判断成功,如果此File表示目录,则目录必须为空才能删除。
    8.5创建删除功能的方法

    • public boolean createNewFile()` :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。

    • public boolean delete() :删除由此File表示的文件或目录。            notes:当目录为空才能删除,

    • public boolean mkdir() :创建由此File表示的目录。

    • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

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

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

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

    9、递归

    9.1 概述

            自己调用自己的现象。
            递归思想顺序

    9.2 举例子介绍:

        
    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);
    	}
    }
     
     
     
    30
     
     
     
     
     
    1
    public class DiGuiDemo {
    2
    public static void main(String[] args) {
    3
    //计算1~num的和,使用递归完成
    4
    int num = 5;
    5
          // 调用求和的方法
    6
    int sum = getSum(num);
    7
          // 输出结果
    8
    System.out.println(sum);
    9
    
    
    10
    }
    11
      /*
    12
        通过递归算法实现.
    13
        参数列表:int 
    14
        返回值类型: int 
    15
      */
    16
    public static int getSum(int num) {
    17
          /* 
    18
             num为1时,方法返回1,
    19
             相当于是方法的出口,num总有是1的情况
    20
          */
    21
    if(num == 1){
    22
    return 1;
    23
    }
    24
          /*
    25
              num不为1时,方法返回 num +(num-1)的累和
    26
              递归调用getSum方法
    27
            */
    28
    return num + getSum(num-1);
    29
    }
    30
    }
     
     
            tips:
                    递归调用保证:1.能够停止下来,有次数限制,否则会发生栈内存溢出
    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);
                }
            }
        }
    }
     
     
     
    x
     
     
     
     
     
    1
    public class DiGuiDemo2 {
    2
        public static void main(String[] args) {
    3
          // 创建File对象
    4
            File dir  = new File("D:\aaa");
    5
          // 调用打印目录方法
    6
            printDir(dir);
    7
        }
    8
    
    
    9
        public static void  printDir(File dir) {
    10
          // 获取子文件和目录
    11
            File[] files = dir.listFiles();
    12
          // 循环打印
    13
          /*
    14
            判断:
    15
            当是文件时,打印绝对路径.
    16
            当是目录时,继续调用打印目录的方法,形成递归调用.
    17
          */
    18
            for (File file : files) {
    19
        // 判断
    20
                if (file.isFile()) {
    21
                  // 是文件,输出文件绝对路径
    22
                    System.out.println("文件名:"+ file.getAbsolutePath());
    23
                } else {
    24
                  // 是目录,输出目录绝对路径
    25
                    System.out.println("目录:"+file.getAbsolutePath());
    26
                  // 继续遍历,调用printDir,形成递归
    27
                    printDir(file);
    28
                }
    29
            }
    30
        }
    31
    }
     
     

    9.3 文件过滤器优化

    java.io.FileFilter 是一个接口,是File的过滤器。该接口的对象可以传递给File类的listFiles(FileFilter) 作为参数,接口中只有一个方法,
            boolean accept(File pathname): 测试pathanme 是否应该包含当前File目录中,符合则返回true
            简单介绍
                    1.接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
                    2.accept 方法,参数为File,表示当前 File 下所有的子类文件和子目录。保留住 则返回true,过滤掉则返回false。保留规则:
                            ①要么是 . java文件
                            ② 要么是目录 ,用于继续遍历。
                    3.通过过滤器的作用,listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印
            代码实现部分:
            
    public class DiGuiDemo4 {
        public static void main(String[] args) {
            File dir = new File("D:\aaa");
            printDir2(dir);
        }
      
        public static void printDir2(File dir) {
          	// 匿名内部类方式,创建过滤器子类对象
            File[] files = dir.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(".java")||pathname.isDirectory();
                }
            });
          	// 循环打印
            for (File file : files) {
                if (file.isFile()) {
                    System.out.println("文件名:" + file.getAbsolutePath());
                } else {
                    printDir2(file);
                }
            }
        }
    }  
     
     
     
    24
     
     
     
     
     
    1
    public class DiGuiDemo4 {
    2
        public static void main(String[] args) {
    3
            File dir = new File("D:\aaa");
    4
            printDir2(dir);
    5
        }
    6
      
    7
        public static void printDir2(File dir) {
    8
          // 匿名内部类方式,创建过滤器子类对象
    9
            File[] files = dir.listFiles(new FileFilter() {
    10
                @Override
    11
                public boolean accept(File pathname) {
    12
                    return pathname.getName().endsWith(".java")||pathname.isDirectory();
    13
                }
    14
            });
    15
          // 循环打印
    16
            for (File file : files) {
    17
                if (file.isFile()) {
    18
                    System.out.println("文件名:" + file.getAbsolutePath());
    19
                } else {
    20
                    printDir2(file);
    21
                }
    22
            }
    23
        }
    24
    }  
     
     
            Lambda优化
            
    public static void printDir3(File dir) {
      	// lambda的改写
        File[] files = dir.listFiles(f ->{ 
          	return f.getName().endsWith(".java") || f.isDirectory(); 
        });
      	
    	// 循环打印
        for (File file : files) {
            if (file.isFile()) {
                System.out.println("文件名:" + file.getAbsolutePath());
          	} else {
            	printDir3(file);
          	}
        }
    }
     
     
     
     
     
     
     
     
     
    1
    public static void printDir3(File dir) {
    2
      // lambda的改写
    3
        File[] files = dir.listFiles(f ->{ 
    4
          return f.getName().endsWith(".java") || f.isDirectory(); 
    5
        });
    6
    
    
    7
    // 循环打印
    8
        for (File file : files) {
    9
            if (file.isFile()) {
    10
                System.out.println("文件名:" + file.getAbsolutePath());
    11
          } else {
    12
            printDir3(file);
    13
          }
    14
        }
    15
    }
     
     
     
     
     
     
     
     
     
     
     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    window 操作
    idea使用
    安装zookeeper
    resource和autowired
    python浅见 (Python 3000)
    Tomcat服务器
    servlet
    事件是一种委托吗?什么是委托?什么是事件?
    int值类型的ToString()方法是否装箱
    抽象类,虚方法与普通类的区别
  • 原文地址:https://www.cnblogs.com/zhengyuan/p/9284767.html
Copyright © 2020-2023  润新知