zoukankan      html  css  js  c++  java
  • File类递归

    ---恢复内容开始---

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

     
    构造方法:
     
    public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 
    public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
    public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。 
    案例:
     
    package com.heima.biji;
    import java.io.File;
    public class Demo02 {
        public static void main(String[] args) {
            //public File(String pathname) :
            // 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
            String pathname="D:\LULIANGHM";
            File file=new File(pathname);
            System.out.println(file);
            //文件路径名path路径
            File file1=new File("D:\LULIANGHM\JAVAEE\Day01\out\production\Day09");
            System.out.println(file1);
            // 通过父级File对象和子路径字符串
            File file2=new File("D:\LULIANGHM\JAVAEE\Day10");
            System.out.println(file2);
            File file3=new File(file2,"bbb.txt");
        }
    }
    注意:1.一个File对象代表硬盘中实际存在的一个文件或者目录.
                2.无论该路径下是否存在文件或者目录,都不影响File的创建.

     
    获取功能的方法
     
    public String getAbsolutePath() :返回此File的绝对路径名字符串。
    public String getPath() :将此File转换为路径名字符串。
    public String getName() :返回由此File表示的文件或目录的名称。 
    public long length() :返回由此File表示的文件的长度。
    演示:
    private static void day02() {
        File file=new File("D://LULIANGHM");
        System.out.println("目的绝对路径:"+file.getAbsolutePath());
        System.out.println("目件的构造路径:"+file.getPath());
        System.out.println("目件名称:"+file.getName());
        System.out.println("目件长度:"+file.length());//4096错误
        //文件路径和上面一样
    }
     

     
    判断功能的方法:
     
    public boolean exists() :此File表示的文件或目录是否实际存在。
    public boolean isDirectory() :此File表示的是否为目录。
    public boolean isFile() :此File表示的是否为文件。
    演示:
    public class FileIs {
        public static void main(String[] args) {
            File f = new File("d:\aaa\bbb.java");
            File f2 = new File("d:\aaa");
            // 判断是否存在
            System.out.println("d:\aaa\bbb.java 是否存在:"+f.exists());
            System.out.println("d:\aaa 是否存在:"+f2.exists());
            // 判断是文件还是目录
            System.out.println("d:\aaa 文件?:"+f2.isFile());
            System.out.println("d:\aaa 目录?:"+f2.isDirectory());
        }
    }
    输出结果:
    d:aaabb.java 是否存在:true
    d:aaa 是否存在:true
    d:aaa 文件?:false
    d:aaa 目录?:true
     
     

     
    创建删除的方法:
     
    public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
    public boolean delete() :删除由此File表示的文件或目录。 
    public boolean mkdir() :创建由此File表示的目录。
    public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
    演示:
     
    package com.heima.biji;
    import java.io.File;
    import java.io.IOException;
     
    public class FileCreateDelete {
        public static void main(String[] args) throws IOException {
            // 文件的创建
            File f = new File("D:aaa.txt");
            System.out.println("是否存在:"+f.exists()); // false
            System.out.println("是否创建:"+f.createNewFile()); // true
            System.out.println("是否存在:"+f.exists()); // true
     
            // 目录的创建
            File f2= new File("newDir");
            System.out.println("是否存在:"+f2.exists());// false
            System.out.println("是否创建:"+f2.mkdir());    // true
            System.out.println("是否存在:"+f2.exists());// true
     
            // 创建多级目录
            File f3= new File("newDira\newDirb");
            System.out.println(f3.mkdir());// false
            File f4= new File("newDira\newDirb");
            System.out.println(f4.mkdirs());// true
     
            // 文件的删除
            System.out.println(f.delete());// true
     
            // 目录的删除
            System.out.println(f2.delete());// true
            System.out.println(f4.delete());// false
        }
    }
    注意:delete方法,如果此File表示目录,则目录必须为空才能删除.

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

    public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。 
    演示:
     
    package com.heima.biji;
    import java.io.File;
    //目录的遍历
    public class Demo04 {
        public static void main(String[] args) {
            File file = new File("D:\LULIANGHM");
            //获取当前目录下文件以及文件夹的名称
            String[] name = file.list();
            for (String s : name) {
                System.out.println(s);
            }
            //获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
            File[] lu = file.listFiles();
            for (File file2 : lu) {
                System.out.println(file2);
            }
        }
    }
    注意:调用listFiles方法的File对象,表示的必须是实际存在的目录,否则会返回null,无法进行遍历.

     
    绝对路径,和相对路径
    • 绝对路径:从盘符开始的路径,这是一个完整的路径
    • 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用
    演示:
     
    private static void day03() {
        //D盘上的文件
        File file=new File("D:\bbb.java");
        System.out.println(file.getAbsolutePath());
        //项目上的文件
        File file1=new File("LULIANGHM\JAVAEE\Day01.java");
        System.out.println(file1.getAbsolutePath());
    }

     
    递归:
    概述:指当前方法的内调用自己的这种现象.
    如:
     
    public stattic void main(String [] args){
    System.out.println("main");
    main(args);
    }
     
    递归题目实现和
    题目分析; num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。
     
    package com.heima.biji;
    //求和
    public class Demo05 {
        public static void main(String[] args) {
            //计算和
            int num=0;
            System.out.println(getSum(2));
        }
        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);
        }
    }
    执行代码图:
     
     
    实现阶乘:
    题目分析: 这与累和类似,只不过换成了乘法运算,学员可以自己练习,需要注意阶乘值符合int类型的范围。
    得出结论:n!=n*(n-1)!
    代码:
     
    package com.heima.biji;
    //阶乘
    public class Demo06 {
        public static void main(String[] args) {
            int num=0;
            System.out.println(lu(3));
        }
    //参数类型:int 返回值类型:int
        public  static  int lu(int num){
    //num=1跳出递归
            if(num==1){
                return 1;
            }
            return num*lu(num-1);
        }
    }
     
    实现打印多级目录:
    分析: 多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。
     
    package com.heima.biji;
    import java.io.File;
    public class Demo07 {
        public static void main(String[] args) {
            //创建File对象
            File dir=new File("D:\LULIANGHM");
            lu(dir);
        }
     
        public static void lu(File dir){
            //获取打印目录的方法
            File [] files=dir.listFiles();
            //循环打印
            /*
                判断:
            当是文件时,打印绝对路径.
            当是目录时,继续调用打印目录的方法,形成递归调用.
            */
            for (File file : files) {
                //判断
                if(file.isFile()){
                    //是文件.java输出文件的绝对路径
                    //isFile:此File表示的是否为文件。
                    //getAbsolutePath:返回此File的绝对路径名字符串
                    System.out.println("文件名:"+file.getAbsolutePath());
                }else {
                    //是目录暑促露露的绝对路径
                    System.out.println("目录:"+file.getAbsolutePath());
                    lu(file);//递归循环
                }
            }
        }
    }
     
    实现文件搜索:
    分析:
    目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
    遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。
    代码:
     
    public class Demo08 {
        public static void main(String[] args) {
            File dir=new File("D:\LULIANGHM");
            lu(dir);
        }
        public static void lu(File dir){
            //获取子文件或者目录方法
            File [] files=dir.listFiles();
            //循环打印
            for (File file : files) {
                //判断
                if(file.isFile()){
                    //再次判断如果是文件,判断文件名并输出文件绝对路径
                    //isFile:此File是否是文件
                    //getName:返回由此File表示的文件或目录的名称
                    //endsWith:以什么为结尾.
                    if(file.getName().endsWith(".java")){
                        System.out.println("文件名:"+file.getAbsolutePath());
                    }
                }else {
                    //是目录
                    lu(file);
                }
            }
        }
    }

     

     
    文件过滤器:
    分析:
     
    java.io.FileFilter是一个接口,是File的过滤器。 该接口的对象可以传递给File类的listFiles(FileFilter) 作为参数, 接口中只有一个方法。
    boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true。
    接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
    accept方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:要么是.java文件。要么是目录,用于继续遍历。
    通过过滤器的作用,listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印。
    代码:
     
    package com.heima.biji;
     
    import java.io.File;
    import java.io.FileFilter;
     
    public class Demo09 {
        public static void main(String[] args) {
            //创建File对象
            File dir=new File("D:\LULIANGHM");
            lu(dir);
        }
        public static void lu(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 {
                    lu(file);
                }
            }
        }
    }
     

     
    Lambda优化:
    分析:
    Lambda格式:
    代码实现;
     
    package com.heima.biji;
    import java.io.File;
    public class Demo10 {
        public static void main(String[] args) {
            File dir=new File("D:\LULIANGHM");
            lu(dir);
        }
        public static void lu(File dir){
            //lambda的改写
            //isDirectory:此File表示的是否为目录。
            //f.getName().endsWith(".java"):获取以此.java文件结尾的文件
            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 {
                    lu(file);
                }
            }
        }
    }

    ---恢复内容结束---

  • 相关阅读:
    原生JS回去顶部
    5月31日の勉強レポート
    5月30日の勉強レポート
    (转)日语自我介绍大全
    5月29日の勉強レポート
    5月28日の勉強レポート
    5月27日の勉強レポート
    5月26日の勉強レポート
    5月25日の勉強レポート
    5月24日の勉強レポート
  • 原文地址:https://www.cnblogs.com/luliang1215/p/10632878.html
Copyright © 2011-2022 走看看