Java进阶学习(二)之File类的使用方法

**

Java进阶学习(二)之File类的使用方法

**
(2020.2.22)
第一部分:File类的基本使用方法

1.File类获取功能的方法

    pulic String getAbsoluth():返回File的绝对路径名称字符串
    public String getPath():将此File转化为路径名称字符串
    public String getName():返回由此File表示的文件或者目录的名称
    public long getLength():返回由此File表示的文件的长度****
import java.io.File;

public class Demo02_File {
    
    
    public static void main(String[] args) {
    
    
        show01();
        show02();
        show03();
        show04();
    }

    /*
        public long getLength():返回由此File表示的文件的长度
        获取的是构造方法指定的文件大小,以字节为单位
        注意:
            文件夹是没有大小概念的,不能获取文件夹的大小
            如果构造方法中给出的路径不存在,那么length():方法返回0;
     */
    private static void show04() {
    
    
        File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
        long length = f1.length();
        System.out.println(length);//5042

        File f2 = new File("C:\\Users\\大大白\\Desktop\\2.html");
        System.out.println(f2.length());//0

        File f3 = new File("C:\\Users\\大大白\\Desktop\\3.html");
        System.out.println(f3.length());//0
    }

    /*
        public String getAbsolutePath():返回File的绝对路径名称字符串
        获取构造方法中传递的路径
        无论路径是绝对的还是相对的,getAbsolutePath()方法返回的都是绝对路径
     */
    public static void show01(){
    
    
        File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\123.txt");
        String absoluthPath1 = f1.getAbsolutePath();
        System.out.println(absoluthPath1);

        File f2 = new File("123.txt");
        String absoluthPath2 = f2.getAbsolutePath();
        System.out.println(absoluthPath2);
    }

    /*
        public String getPath():将此File转化为路径名称字符串
        获取构造方法中传递的路径

        toString()方法就是调用的getPath()方法
     */
    public static void show02(){
    
    
        File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\123.txt");
        File f2 = new File("123.txt");
        String path1 = f1.getPath();
        System.out.println(path1);//C:\Users\大大白\IdeaProjects\Day01_File\123.txt
        String path2 = f2.getPath();
        System.out.println(path2);//123.txt

        System.out.println(f1);//C:\Users\大大白\IdeaProjects\Day01_File\123.txt
        System.out.println(f1.toString());//C:\Users\大大白\IdeaProjects\Day01_File\123.txt
    }

    /*
        public String getName():返回由此File表示的文件或者目录的名称
        获取的就是构造方法传递路径的结尾部分(文件/文件夹)
     */
    public static void show03(){
    
    
        File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\123.txt");
        String name1 = f1.getName();
        System.out.println(name1);

        File f2 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File");
        String name2 = f2.getName();
        System.out.println(name2);
    }
}

2.文件/文件夹存在判断

public boolean exist():此File表示的文件或目录是否实际存在
public boolean isDirectory():此File表示的是否为目录
public boolean isFile():此File表示是否为文件
import java.io.File;

public class Demo03_File {
    
    
    public static void main(String[] args) {
    
    
        show01();
        show02();
        show03();
    }

    /*
        public boolean isFile():此File表示是否为文件
     */
    private static void show03() {
    
    
        File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
        File f2 = new File("C:\\Users\\大大白\\Desktop");

        boolean file1 = f1.isFile();
        boolean file2 = f2.isFile();

        System.out.println(file1);
        System.out.println(file2);
    }

    /*
        public boolean isDirectory():此File表示的是否为目录
     */
    private static void show02() {
    
    
        File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
        File f2 = new File("C:\\Users\\大大白\\Desktop");

        boolean directory1 = f1.isDirectory();
        boolean directory2 = f2.isDirectory();

        System.out.println(directory1);
        System.out.println(directory2);
    }

    /*
        public boolean exist():此File表示的文件或目录是否实际存在
     */
    private static void show01() {
    
    
        File f1 = new File("C:\\Users\\大大白\\Desktop\\1.html");
        File f2 = new File("C:\\Users\\大大白\\Desktop");

        boolean exists1 = f1.exists();
        System.out.println(exists1);

        boolean exists2 = f2.exists();
        System.out.println(exists2);
    }
}

3.文件/文件夹创建和删除

    public boolean createNewFile():当且仅当具有该名称的文件尚不存在时创建一个新的文件。
    public boolean delete():删除由此File表示的文件和目录
    public boolean mkdir():创建由此File表示的目录
    public boolean mkdirs():创建由此File表示的目录,包括任何必须但不存在的父目录
import java.io.File;
import java.io.IOException;

public class FileCreateDelete {
    
    
    public static void main(String[] args) throws IOException {
    
    
        show01();
        show02();
        show03();
    }

    /*
         public boolean delete():删除由此File表示的文件和目录
         注意:delete方法是直接在硬盘删除文件//文件夹,不走回收站,删除要谨慎。
     */
    private static void show03() {
    
    
        File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\Day01_File\\新建文件夹");
        System.out.println(f1.delete());

        File f2  = new File("Day01_File\\3.txt");
        System.out.println(f2.delete());

    }

    /*
        public boolean mkdir():创建由此File表示的目录,创建单级文件夹
        public boolean mkdirs():创建由此File表示的目录,包括任何必须但不存在的父目录,创建多级文件夹。
     */
    private static void show02() {
    
    
        File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\111");
        boolean mkdir = f1.mkdir();
        System.out.println(mkdir);

        File f2 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\111\\222\\333\\444");
        System.out.println(f2.mkdirs());

        File f3 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\111\\222\\333\\444\\555\\1236.txt");
        System.out.println(f3.mkdirs());
    }

    /*
        public boolean createNewFile():当且仅当具有该名称的文件尚不存在时创建一个新的文件。
        public boolean createNewFile() throws IOException
        createNewFile声明抛出了IOException,我们调用这个方法,就必须处理这个异常,或者抛出异常。
        注意:
            1.此方法只能创建文件不能创建文件夹
            2.创建文件的路径必须存在,否则会抛出异常
     */
    private static void show01() throws IOException {
    
    
        File f1 = new File("C:\\Users\\大大白\\IdeaProjects\\Day01_File\\2.txt");
        boolean file = f1.createNewFile();
        System.out.println(file);

        File f2  = new File("Day01_File\\3.txt");
        System.out.println(f2.createNewFile());

        File f3  = new File("Day01_File\\新建文件夹");//仍然时文件。
        System.out.println(f3.createNewFile());
    }
}

4.文件的遍历

	public String list():返回一个String数组,表示该File目录中的所有子文件和目录
    public File[] listFiles():返回一个File数组,表示该File目录中的所有子文件或目录
import java.io.File;

public class FileFor {
    
    
    public static void main(String[] args) {
    
    
        File dir = new File("D:\\APKDB");//目录不存在,则抛出空指针异常

        //获取当前目录下的文件目录和文件名称
        String[] names = dir.list();
        for (String name : names) {
    
    
            System.out.println(name);
        }

        //获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
        File[] files = dir.listFiles();
        for (File file : files) {
    
    
            System.out.println(file);
        }

    }
}

5.文件的递归遍历

public class Demo01_DiGui {
    
    
    public static void main(String[] args) {
    
    
        //a();
        b(1);
    }

    /*
        构造方法,禁止递归
            编译报错:构造方法是创建对象使用的,一直递归会导致内存中有无数个对象,直接编译报错
     */
    public Demo01_DiGui(){
    
    
       // Demo01_DiGui();
    }

    private static void b(int i) {
    
    
        System.out.println(i);
        if(i==20000){
    
    
            return;
        }
        b(++i);
    }

    /*
        递归要有条件使程序停止,否则会出现栈内存溢出。
        Exception in thread "main" java.lang.StackOverflowError
     */
    private static void a() {
    
    
        System.out.println("a方法");
        a();
    }
}

第二部分:递归以及文件的递归遍历

案例1:遍历打印文件多级目录

import java.io.File;

/*
    递归打印多级目录
 */
public class DiGuiDemo3 {
    
    
    public static void main(String[] args) {
    
    
        File dir =  new File("D:\\APKDB");
        getAllFile(dir);
        System.out.println("递归打印多级目录:");
        getAllFile2(dir);
    }

    private static void getAllFile(File dir) {
    
    
        File[] files = dir.listFiles();
        for (File file : files) {
    
    
            System.out.println(file);
        }
    }

    public static void getAllFile2(File dir){
    
    
        File[] files = dir.listFiles();
        for (File file : files) {
    
    
            if(file.isDirectory()){
    
    
                getAllFile2(file);
            }else{
    
    
                System.out.println(file);
            }
        }
    }
}

案例2:文件搜素

分析:
	1.目标搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
     2.遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。
public class DiGuiDemo4 {
    
    
    public static void main(String[] args) {
    
    
        //创建File对象
        File dir = new File("D:\\APKDB");
        //调用打印方法
        printDir(dir);
    }

    private static void printDir(File dir) {
    
    
        File[] files = dir.listFiles();
        for (File file : files) {
    
    
            if(file.isDirectory()){
    
    
                printDir(file);
            }else {
    
    
//                /*
//                    只要.exe结尾的文件
//                    1.把File对象file,转化为字符串对象
//                */
//                //String name = file.getName();
//                //String path = file.getPath();
//                String s = file.toString();
//
//                //2.把字符串转化为小写
//                s = s.toLowerCase();
//
//                //3.调用String类中的方法endWith判断字符串是否以.exe结尾
//                boolean b = s.endsWith(".exe");
//
//                //4.打印
//                if(b){
    
    
//                    System.out.println(file);
//                }

                if(file.toString().toLowerCase().endsWith(".exe")){
    
    
                    System.out.println(file);
                }
            }
        }
    }
}

第三部分:文件过滤器FileFilter和FileNameFilter
需求:打印多级目录
可以使用过滤器来实现这一功能
在File类中有2个和listFile重载的方法,方法的参数传递就是过滤器

listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。

java.io.FileFilter接口:抽象路径(File对象)名的过滤器。
    boolean accept(File pathname)测试指定的抽象路径名是否应包含在路径名列表中。
        参数
            pathname - 要测试的抽象路径名
        结果
            true if and only if pathname should be included

java.io.Interface FilenameFilter
    boolean accept(File dir,String name)测试指定文件是否应包含在文件列表中。
        参数
            dir - 找到该文件的目录。
            name - 文件的名称。
        结果
            true当且仅当该名称应包含在文件列表中时; false否则。

 注意:2个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤器的方法accept,在方法中自己定义过滤的规则
public class FileFilter_Demo {
    
    
    public static void main(String[] args) {
    
    
        //创建File对象
        File dir = new File("D:\\APKDB");
        //调用打印方法
        printDir(dir);
    }

    private static void printDir(File dir) {
    
    
        //File[] files = dir.listFiles(new FileFilterImpl());//传递过滤器对象listF
//        File[] files = dir.listFiles(new FileFilter() {
    
    
//            @Override
//            public boolean accept(File pathname) {
    
    
//                if(pathname.isDirectory()){
    
    
//                    return true;
//                }
//                return pathname.toString().toLowerCase().endsWith(".exe");
//            }
//        });
//        File[] files = dir.listFiles(new FilenameFilter() {
    
    
//            @Override
//            public boolean accept(File dir, String name) {
    
    
//                return new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".exe");
//            }
//        });

//        //使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)
//        File[] files = dir.listFiles((File d,String name)->{
    
    
//            return new File(d,name).isDirectory()||name.toLowerCase().endsWith(".exe");
//        });

        //使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)
        File[] files = dir.listFiles((d,name)-> new File(d,name).isDirectory()||name.toLowerCase().endsWith(".exe"));
        /*
            listFile一共做了3件事情
            (1)listFiles方法会对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹-->封装为File对象
            (2)listFiles方法调用参数传递的过滤器中的方法accept
            (3)listFiles方法会把遍历得到的每一个File对象,传递过accept方法的参数pathname
         */
        for (File file : files) {
    
    
            if(file.isDirectory()){
    
    
                printDir(file);
            }else{
    
    
                System.out.println(file);
            }
        }
    }
}

重写过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则

/*
    重写过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则
 */
public class FileFilterImpl implements FileFilter {
    
    
    @Override
    public boolean accept(File pathname) {
    
    
        /*
            判断file对象是否是以.exe结尾
         */
        if(pathname.isDirectory()){
    
    
            return true;
        }

        return pathname.toString().toLowerCase().endsWith(".exe");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35843514/article/details/104446531
今日推荐