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:\aaa\bbb.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);
            }
        }
    }
}

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

posted on 2019-03-31 20:11  风一般的男子·小亮  阅读(106)  评论(0编辑  收藏  举报

导航