学习记录——进阶版08

@学习记录

开始学习Java

遵从同学的指导,从Java se开始学习

黑马的JavaSE零基础入门【File类、递归】

第一章 File类

1.1 概述

19-03 File类的概述和静态成员变量
package day_08FileAndRecursion.demo01File;

import java.io.File;

/*
java.io.File类
文件和目录路径名的抽象表示形式
java把电脑中的文件和文件夹(目录)封装为了一个File类,可以使用File类对文件和文件夹进行操作
    创建文件/文件夹
    删除文件/文件夹
    获取文件/文件夹
    判断文件/文件夹是否存在
    对文件夹进行遍历
    获取文件的大小
File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法

file:文件
directory:文件夹
path:路径

static String pathSeparator 与系统有关的路径分隔符,为了方便,他被表示为了一个字符串
static char pathSeparator 与系统有关的路径分隔符

static String separator 与系统有关的默认名称分隔符,为了方便,他被表示为了一个字符串
static char separator 与系统有关的默认名称分隔符

操作路径不能写死
D:\ruanjian\MATLAB windows
D:/ruanjian/MATLAB Linux
"D:"+File.separator+"ruanjian"+File.separator+"MATLAB"
 */
public class Demo01File {
    
    
    public static void main(String[] args) {
    
    
        String pathSeparator = File.pathSeparator;
        System.out.println(pathSeparator); // 路径分隔符,windows ; Linux :

        String separator = File.separator;
        System.out.println(separator); // 默认名称分隔符,windows \ Linux /
    }
}


19-04 绝对路径和相对路径
/*
路径:
绝对路径:是一个完整的路径,以盘符开始的路径
相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录而言

注意:路径不区分大小写,路径中的文件名称分隔符windows使用反斜杠,两个反斜杠代表一个普通的反斜杠
 */

1.2 构造方法

19-05 File类的构造方法
package day_08FileAndRecursion.demo01File;

import java.io.File;

/*
路径:
绝对路径:是一个完整的路径,以盘符开始的路径
相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录而言

注意:路径不区分大小写,路径中的文件名称分隔符windows使用反斜杠,两个反斜杠代表一个普通的反斜杠

File类的构造方法
 */
public class Demo02File {
    
    
    public static void main(String[] args) {
    
    
        show01();
        show02();
        show03();
    }

    /*
    File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建新的实例
    pathname可以以文件结尾,也可以是文件夹结尾
    pathname可以是相对路径,也可以是绝对路径
    pathname可以是存在,也可以是不存在
    创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况
     */
    private static void show01() {
    
    
        File file = new File("a.txt");
        System.out.println(file);
    }

    /*
    File(String parent, String child) 根据parent路径名字符串和chile路径名字符串创建一个新的File实例
    把路径分成了两个部分,好处是:父路径和子路径可以单独书写,使用灵活,都可以变化
     */
    private static void show02() {
    
    
        File file = new File("c:\\", "a.txt");
        System.out.println(file);
    }

    /*
    File(File parent, String child) 根据parent路径名字符串和chile路径名字符串创建一个新的File实例
    把路径分成了两个部分,好处是:父路径和子路径可以单独书写,使用灵活,都可以变化;父路径是File类型,可以使用File的方法对路径进行一些操作
    */
    private static void show03() {
    
    
        File parent = new File("d:\\");
        File file = new File(parent, "b.xls");
        System.out.println(file);
    }



}


1.3 常用方法

获取功能的方法
绝对路径和相对路径

19-06 File类获取功能的方法
package day_08FileAndRecursion.demo01File;

import java.io.File;

/*
File类获取功能的方法
    public String getAbsolutePath() 返回此File的绝对路径名字符串
    public String getPath() 将此File转换为路径名字符串
    public String getName() 返回由此File表示的文件或目录的名称
    public long length() 返回由此File表示的文件的长度
 */
public class Demo03File {
    
    
    public static void main(String[] args) {
    
    
        show01();
        System.out.println("===============");
        show02();
        System.out.println("===============");
        show03();
        System.out.println("===============");
        show04();
    }

    private static void show01() {
    
    
        File file1 = new File("b.xls");
        File file2 = new File("D:\\IDEA\\test-java\\b.xls");
        System.out.println(file1.getAbsolutePath());
        System.out.println(file2.getAbsolutePath());

    }

    // 获取的是构造方法中传递的路径
    // toString就是调用的getPath方法

    private static void show02() {
    
    
        File file1 = new File("b.xls");
        File file2 = new File("D:\\IDEA\\test-java\\b.xls");
        System.out.println(file1.getPath());
        System.out.println(file2.getPath());
    }
    // 获取的是构造方法中传递的路径的结尾部分(文件/文件夹)

    private static void show03() {
    
    
        File file1 = new File("b.xls");
        File file2 = new File("D:\\IDEA\\test-java");
        System.out.println(file1.getName());
        System.out.println(file2.getName());

    }

    // 获取的是构造方法指定的文件的大小,以字节为单位
    // 注意:文件夹是没有大小概念的,不能获取文件夹的大小;
    // 如果构造方法中给出的路径不存在,那么length方法返回0
    private static void show04() {
    
    
        File file1 = new File("b.xls");
        File file2 = new File("D:\\IDEA\\test-java");
        System.out.println(file1.length());
        System.out.println(file2.length()); // 文件夹返回是0
    }
}


判断功能的方法

19-07 File类判断功能的方法
package day_08FileAndRecursion.demo01File;

import java.io.File;

/*
File判断功能的方法
    public boolean exists() 此File表示的文件或目录是否实际存在
    public boolean isDirectory() 此File表示的是否为目录
    public boolean isFile() 此File表示的是否为文件
 */
public class Demo04File {
    
    
    public static void main(String[] args) {
    
    
        show01();
        System.out.println("================");
        show02();
    }

    private static void show01() {
    
    
        File file1 = new File("a.txt");
        File file2 = new File("D:\\IDEA\\test-java");
        System.out.println(file1.exists());
        System.out.println(file2.exists());
    }

    // 两个方法是互斥的,他们的使用前提:路径必须是存在的,否则都返回false
    // 因此需要先判断文件/文件夹是否存在
    private static void show02() {
    
    
        File file1 = new File("b.txt");
        File file2 = new File("test-java.iml");
        File file3 = new File("D:\\IDEA\\test-java");
        if(file1.exists()) {
    
    
            System.out.println(file1.isDirectory());
            System.out.println(file1.isFile());
        }
        if(file2.exists()) {
    
    
            System.out.println(file2.isDirectory());
            System.out.println(file2.isFile());
        }
        if(file3.exists()) {
    
    
            System.out.println(file3.isDirectory());
            System.out.println(file3.isFile());
        }




    }


}


创建删除功能的方法

19-08 File类创建删除功能的方法
package day_08FileAndRecursion.demo01File;

import java.io.File;
import java.io.IOException;

/*
File类创建删除功能的方法
    public boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件
    public boolean delete() 删除由此File表示的文件或目录
    public boolean mkdir() 创建由此File表示的目录
    public boolean mkdirs() 创建由此File表示的目录,包括任何必需但不存在的父目录
 */
public class Demo05File {
    
    
    public static void main(String[] args) throws IOException {
    
    
        show01();
        System.out.println("===============");
        show02();
        System.out.println("===============");
        show03();

    }


    /*
    注意:
        1.此方法只能创建文件,不能创建文件夹
        2.创建文件的路径必须存在,否则会抛出异常
    */
    private static void show01() throws IOException {
    
    
        File file = new File("D:\\IDEA\\test-java\\a.txt");
        boolean newFile = file.createNewFile();
        System.out.println(newFile);
    }

    // 创建文件的路径必须存在,否则会返回false
    private static void show02() {
    
    
        File file1 = new File("D:\\IDEA\\test-java\\java1");
        File file2 = new File("D:\\IDEA\\test-java\\java2\\33");
        boolean mkdir = file1.mkdir();
        boolean mkdirs = file2.mkdirs();
        System.out.println(mkdir);
        System.out.println(mkdirs);
    }

    // 文件夹中有内容,不会删除返回false;构造方法中路径不存在false
    // 注意:该方法直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎
    private static void show03() {
    
    
        File file1 = new File("D:\\IDEA\\test-java\\java1");
        File file2 = new File("D:\\IDEA\\test-java\\java3");
        boolean delete1 = file1.delete();
        boolean delete2 = file2.delete();
        System.out.println(delete1);
        System.out.println(delete2); // 路径不存在
    }
}


1.4 目录的遍历

19-09 File类遍历(文件夹)目录功能
package day_08FileAndRecursion.demo01File;

import java.io.File;

/*
File类遍历(文件夹)目录功能
    public String[] list() 返回一个String数组,表示该File目录中的所有子文件或目录
    public File[] listFiles() 返回一个File数组,表示该File目录中的所有子文件或目录

注意:
    list方法和listFiles方法遍历的是构造方法中给出的目录
    如果构造方法中给出的目录的路径不存在,会抛出空指针异常
    如果构造方法中给出的路径不是一个目录,也会抛出空指针异常
 */
public class Demo06File {
    
    
    public static void main(String[] args) {
    
    
        show01();
        System.out.println("==============");
        show02();
    }

    private static void show01() {
    
    
        File file1 = new File("D:\\IDEA\\test-java");
        String[] list = file1.list();
        for (String s : list) {
    
    
            System.out.println(s);
        }
    }

    private static void show02() {
    
    
        File file1 = new File("D:\\IDEA\\test-java");
        File[] files = file1.listFiles();
        for (File file : files) {
    
    
            System.out.println(file);
        }
    }
}

第二章 递归

2.1 概述

19-10 递归概念和分类和注意事项
package day_08FileAndRecursion.demo02Recursion;

/*
递归:方法自己调用自己
递归的分类:
    直接递归:方法自身调用自己
    间接递归:A方法调用B方法,B方法调用C方法,C方法调用A方法

注意事项:
    递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
    在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
    构造方法禁止递归

递归的使用前提:
    当调用方法时,方法的主体不变,每次调用方法的参数不同,可以使用递归
 */
public class Demo01Recursion {
    
    
    public static void main(String[] args) {
    
    
        a();
    }

    private static void a() {
    
    
        System.out.println("a方法");
        a();
    }
}

在这里插入图片描述


2.2 递归累加求和

计算1~n的和
代码执行图解

19-11 练习:使用递归计算1~n之间的和
package day_08FileAndRecursion.demo02Recursion;

import static day_03.demo04.Demo01VarArgs.add;

/*
练习:使用递归计算1~n之间的和

已知:最大值n,最小值1
递归停止条件:n = 1
递归的目的:获取下一个被加的数字
 */
public class Demo02Recursion {
    
    
    public static void main(String[] args) {
    
    
        System.out.println(sum(3));;
    }

    private static int sum(int i) {
    
    
        if(i == 1){
    
    
            return 1; // n=1时无法形成递归,直接返回结果
        } else {
    
    
            return i + sum(i-1);
        }
    }
}

在这里插入图片描述

2.3 递归求阶乘

19-12 练习:使用递归计算阶乘
package day_08FileAndRecursion.demo02Recursion;

/*
练习:使用递归计算1~n之间的乘积

已知:最大值n,最小值1
递归停止条件:n = 1
递归的目的:获取下一个被乘的数字
 */
public class Demo03Recursion {
    
    
    public static void main(String[] args) {
    
    
        System.out.println(multi(4));;
    }

    private static int multi(int i) {
    
    
        if(i == 1){
    
    
            return 1; // n=1时无法形成递归,直接返回结果
        } else {
    
    
            return i * multi(i-1);
        }
    }
}


2.4 递归打印多级目录

19-13 练习:递归打印多级目录
package day_08FileAndRecursion.demo02Recursion;

import java.io.File;

/*
练习:递归打印多级目录
 */
public class Demo04Recursion {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("D:\\面试");
        printFile(file);

    }

    // 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
    public static void printFile(File dir){
    
    
        System.out.println(dir);
        File[] files = dir.listFiles();
        for (File file : files) {
    
    
            if (file.isFile()) {
    
    
                System.out.println(file);
            } else {
    
    
                printFile(file);
            }
        }

    }
}


第三章 综合案例

3.1 文件搜索

19-14 练习:综合案例文件搜索
package day_08FileAndRecursion.demo02Recursion;

import java.io.File;

/*
练习:文件搜索
搜索D:\aaa目录中的.java文件

先遍历文件目录,找到所有文件
再判断是否为.java文件
 */
public class Demo05Recursion {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("D:\\IDEA\\test-java");
        printFile(file);

    }

    // 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
    public static void printFile(File dir){
    
    
        File[] files = dir.listFiles();
        for (File file : files) {
    
    
            if (file.isFile()) {
    
    
                // 判断是否为.java文件
                // 利用String的endsWith进行判断
                // 可以利用getName,getPath,toString方法
                // toLowerCase()把大写字母转换为小写字母
                if (file.toString().toLowerCase().endsWith(".java")) {
    
    
                    System.out.println(file);
                }
            } else {
    
    
                printFile(file);
            }
        }

    }

}




3.2 文件过滤器优化

19-15 练习:FileFilter文件过滤器的原理和使用
package day_08FileAndRecursion.demo03Filter;

import java.io.File;
import java.io.FileFilter;

/*
使用过滤器实现文件的查找
在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器
File[] listFilter(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名的过滤器
    作用:用来过滤文件
    抽象方法:用来过滤文件的方法
        boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中

File[] listFilesFilter(FilenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实现可用于过滤器文件名
    作用:用来过滤文件名称
    抽象方法:用来过滤文件的方法
        boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中

注意:两个过滤器接口是没有实现类的,需要自己写实现类,重写过滤的方法accept,在方法中自定义过滤的规则

 */
public class Demo01Filter {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("D:\\IDEA\\test-java");
        printFile(file);

    }

    /*// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
    public static void printFile(File dir) {
        File[] files = dir.listFiles(new FileFilterImpl()); // 传递过滤器对象
        for (File file : files) {
            System.out.println(file);
            if (file.isFile()) {
                // 判断是否为.java文件
                System.out.println(file);
            } else {
                printFile(file);
            }
        }


    }*/

    /*// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
    // 匿名内部类
    public static void printFile(File dir) {
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getPath().toLowerCase().endsWith(".java");
            }
        }); // 传递过滤器对象
        for (File file : files) {
            System.out.println(file);
            if (file.isFile()) {
                // 判断是否为.java文件
                System.out.println(file);
            } else {
                printFile(file);
            }
        }


    }*/

    // 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
    // lambda优化
    public static void printFile(File dir) {
    
    
        File[] files = dir.listFiles( pathname -> pathname.isDirectory() || pathname.getPath().toLowerCase().endsWith(".java")); // 传递过滤器对象
        for (File file : files) {
    
    
            System.out.println(file);
            if (file.isFile()) {
    
    
                // 判断是否为.java文件
                System.out.println(file);
            } else {
    
    
                printFile(file);
            }
        }


    }
}


package day_08FileAndRecursion.demo03Filter;

import java.io.File;
import java.io.FileFilter;

// 创建过滤器的实现类
public class FileFilterImpl implements FileFilter {
    
    
    @Override
    public boolean accept(File pathname) {
    
    

        // 如果pathname是一个文件加,也返回true,继续遍历这个文件夹
        if (pathname.isDirectory()) {
    
    
            return true;
        }
        return pathname.toString().toLowerCase().endsWith(".java");
    }
}

在这里插入图片描述


19-16 练习:FilenameFilter文件过滤器的原理和使用
package day_08FileAndRecursion.demo03Filter;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

/*
使用过滤器实现文件的查找
在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器
File[] listFilter(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名的过滤器
    作用:用来过滤文件
    抽象方法:用来过滤文件的方法
        boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中

File[] listFilesFilter(FilenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实现可用于过滤器文件名
    作用:用来过滤文件名称
    抽象方法:用来过滤文件的方法
        boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中

注意:两个过滤器接口是没有实现类的,需要自己写实现类,重写过滤的方法accept,在方法中自定义过滤的规则

 */
public class Demo02Filter {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("D:\\IDEA\\test-java");
        printFile(file);

    }



    /*// 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
    // 匿名内部类
    public static void printFile(File dir) {
        File[] files = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
            }
        }); // 传递过滤器对象
        for (File file : files) {
            System.out.println(file);
            if (file.isFile()) {
                // 判断是否为.java文件
                System.out.println(file);
            } else {
                printFile(file);
            }
        }


    }*/

    // 定义一个方法,参数传递file类型的目录,方法中对目录进行遍历
    // lambda优化
    public static void printFile(File dir) {
    
    
        File[] files = dir.listFiles((dire, name) -> new File(dire,name).isDirectory() || name.toLowerCase().endsWith(".java")); // 传递过滤器对象
        for (File file : files) {
    
    
            System.out.println(file);
            if (file.isFile()) {
    
    
                // 判断是否为.java文件
                System.out.println(file);
            } else {
    
    
                printFile(file);
            }
        }


    }

}

3.3 Lambda优化

猜你喜欢

转载自blog.csdn.net/weixin_42690266/article/details/114020963
今日推荐