File类、递归

File类、递归

文件类:File

java.io.File
此类和后面的IO流一点关系都没有,还是一个与操作系统无关的类,任何操作系统都可以用File类中的方法
文件和目录路径名的抽象表示形式
Java中把电脑中的文件和文件夹(目录)封装为一个File类。
我们可以使用File类对文件和文件夹进行操作

File类方法:

创建文件/文件夹的方法
删除文件/文件夹的方法
获取文件/文件夹的方法
判断文件/文件夹是否存在的方法
遍历文件/文件夹的方法
获取文件大小
重点:记住三个单词——
file:文件
directory:文件夹/目录
path:路径

import java.io.File;


public class FileTest01 {
    public static void main(String[] args) {
        /*
        public static final String pathSeparator与系统相关的路径分隔符字符,为方便起见,表示为字符串。
        public static final char pathSeparatorChar与系统相关的路径分隔符。
        public static final String separator与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
        public static final char separatorChar与系统相关的默认名称分隔符。
        操作路径:适应不同的操作系统
        c:\a\b\a.txt Windows
        c:/a/b/a.txt linux
        "c"+File.separator+"a"+File.separator+"b"+File.separator+"a.txt"
         */
        String pathSeparator = File.pathSeparator;
        System.out.println(pathSeparator);//  ;  路径分隔符 Windows系统中; Linux系统中是:
        char pathSeparatorChar = File.pathSeparatorChar;
        System.out.println(pathSeparatorChar);//   ; 路径分隔符 Windows系统中; Linux系统中是:
        String separator = File.separator;
        System.out.println(separator);//   \ 文件名称分隔符 Windows系统中\ Linux系统中是/
        char separatorChar = File.separatorChar;
        System.out.println(separatorChar);//  \ 文件名称分隔符 Windows系统中\ Linux系统中是/

    }
}

路径:
绝对路径:是一个完整的路径,以盘符(c: d:)开始的路径
D:\workspace0801\day18\src\com\hqyj\demo01\FileTest02.java
相对路径:是一个简化的路径,相对于根目录,路径简化为day18\src\com\hqyj\demo01\FileTest02.java FileTest02.java
注意:
1.路径不区分大小写
2.\是个转义字符,在代码中书写时要用两个反斜杠\才能输出一个反斜杠\

import java.io.File;


public class FileTest02 {
    public static void main(String[] args) {
//            show02("d:\\","b.txt");
        show03();
    }
    /*
    public File(File parent,String child)从父抽象路径名和子路径名字符串创建新的File实例。
    好处:
    1.父路径和子路径单独书写,使用起来非常灵活,父路径和子路经可以分别随时改动
    2.父路径是一个File类型,可以使用File类中的方法对父路径进行一系列的操作
     */
    private static void show03() {
        File parent = new File("c:\\");
        File f1 = new File(parent,"hello.java");
        System.out.println(f1);
    }

    /*
    public File(String parent,String child)从父路径名字符串和子路径名字符串创建新的File实例。
    好处:父路径和子路径单独书写,使用起来非常灵活,父路径和子路经可以分别随时改动
     */
    private static void show02(String parent,String child) {
        File f1 = new File(parent,child);
        System.out.println(f1);
    }

    /*
    public File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的File实例。
    参数:
    pathname - 路径名字符串
    路径可以是以文件结尾,也可以是以文件夹结尾
    路径可以是相对路径,也可以是绝对路径
    路径可以是存在,也可以是不存在的
    创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况
     */
    private static void show01() {
        File f1 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo05\\FileTest02.java");
        System.out.println(f1);
        File f2 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo05");
        System.out.println(f2);

        File f3 = new File("D:\\a.txt");
        System.out.println(f3);
        File f4 = new File("a.txt");
        System.out.println(f4);

    }
}

File类获取功能的方法:

import java.io.File;

/*
File类获取功能的方法:
public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
public String getPath()将此抽象路径名转换为路径名字符串。
public String getName()返回由此抽象路径名表示的文件或目录的名称。
public long length()返回由此抽象路径名表示的文件的长度。
 */
public class FileTest03 {
    public static void main(String[] args) {
        show04();
    }
/*
public long length()返回由此抽象路径名表示的文件的长度。
注意:文件夹没有大小概念,不能获取文件夹大小;文件有大小的,以字节为单位的
如果构造方法中给出的路径不存在,那么length值也会返回0
 */
    private static void show04() {
        File f1 = new File("D:\\upload\\2.jpg");
        long l1 = f1.length();
        System.out.println(l1);
        File f2 = new File("D:\\upload");
        long l2 = f2.length();
        System.out.println(l2);
        File f3 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo05");
        long l3 = f3.length();
        System.out.println(l3);//文件夹也要记录本身的信息和里面的文件及文件夹,4096时划分硬盘时最小扇区大小

    }

    /*
    public String getName()返回由此抽象路径名表示的文件或目录的名称。
    获取到的是路径的结尾部分
     */
    private static void show03() {
        File f1 = new File("D:\\upload\\2.jpg");
        String name = f1.getName();
        System.out.println(name);

    }

    /*
    public String getPath()将此抽象路径名转换为路径名字符串。
     */
    private static void show02() {

        File f1 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo05\\FileTest03.java");

        File f2 = new File("a.txt");
        String path1 = f1.getPath();
        String path2 = f2.getPath();
        System.out.println(path1);
        System.out.println(path2);
    }

    /*
public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
无论构造方法传递的路径是绝对路径还是相对路径,getAbsolutePath()方法
调用后返回的都是绝对路径字符串
     */
    private static void show01() {
        File f1 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo05\\FileTest03.java");
        String absolutePath = f1.getAbsolutePath();
        System.out.println(absolutePath);
        File f2 = new File("a.txt");
        String absolutePath1 = f2.getAbsolutePath();
        System.out.println(absolutePath1);


    }

}

File类判断功能的方法:

import java.io.File;

/*
File类判断功能的方法:
public boolean exists()测试此抽象路径名表示的文件或目录是否存在。
public boolean isDirectory()测试此抽象路径名表示的文件是否为目录。
public boolean isFile()测试此抽象路径名表示的文件是否为普通文件。
 */
public class FileTest04 {
    public static void main(String[] args) {
        show02();
    }
/*
public boolean isDirectory()测试此抽象路径名表示的文件是否为目录。
public boolean isFile()测试此抽象路径名表示的文件是否为普通文件。

 */
    private static void show02() {
        File f2 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo01");
        if(f2.exists()) {
            System.out.println(f2.isFile());
            System.out.println(f2.isDirectory());
        }
    }

    /*
    public boolean exists()测试此抽象路径名表示的文件或目录是否存在。
     */
    private static void show01() {

        File f1 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo05\\FileTest03.java");
        System.out.println(f1.exists());
        File f2 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo01");
        System.out.println(f2.exists());
        File f3 = new File("D:\\workspace210701\\day03\\src\\com\\hqyj\\demo01\\a");
        System.out.println(f3.exists());

    }

}

File类创建删除功能的方法:


import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;

/*
File类创建删除功能的方法:
public boolean createNewFile()throws IOException当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
public boolean delete()删除由此抽象路径名表示的文件或目录。
public boolean mkdir()创建由此抽象路径名命名的目录。
public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
 */
public class FileTest05 {
    public static void main(String[] args) throws IOException {
        show03();
    }
    /*
    public boolean delete()删除由此抽象路径名表示的文件或目录。
     */
    private static void show03() {
        File f1 = new File("D:\\workspace210701\\day03\\aaa");
        boolean b1 = f1.delete();
        System.out.println(b1);

    }

    /*
    public boolean mkdir()创建由此抽象路径名命名的目录。
    public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
     */
    private static void show02() {

        File f1 = new File("D:\\workspace210701\\day03\\aaa");
        boolean b1 = f1.mkdir();
        System.out.println(b1);
        File f2 = new File("D:\\workspace210701\\day03\\111\\222\\333");
        boolean b2 = f2.mkdirs();
        System.out.println(b2);


    }

    /*

    public boolean createNewFile()throws IOException
    当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
    注意:
    1.此方法只能创建文件,不能创建文件夹
    2.创建文件的路径必须存在,否则会抛出异常
     */
    private static void show01() throws IOException {
        File f1 = new File("D:\\workspace210701\\day03\\1.txt");
        boolean b1 = f1.createNewFile();
        System.out.println(b1);
        File f2 = new File("D:\\workspace210701\\day03\\a");
        boolean b2 = f2.createNewFile();
        System.out.println(b2);


    }
}

File类遍历文件夹(目录)功能:

package com.hqyj.demo05;

import java.io.File;

/*
File类遍历文件夹(目录)功能:
public String[] list()返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
public File[] listFiles()返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
注意:
list()和listFiles()方法遍历的是构造方法中给出的目录
如果构造方法给出的目录不存在,就会抛出空指针
如果构造方法给出的不是一个目录,也会抛出空指针
 */
public class FileTest06 {
    public static void main(String[] args) {
        show02();
    }
    /*
    public File[] listFiles()
     */
    private static void show02() {
    File f1 = new File("D:\\JDK\\jdk1.8.0_212");
        File[] files = f1.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }

    /*
    public String[] list()
     */
    private static void show01() {
        File f1 = new File("D:\\workspace210701\\day03");
        String[] list = f1.list();
        for (String s : list) {
            System.out.println(s);
        }

    }
}

递归:

方法自己调用自己——用到的较少

递归的分类
分为两种:直接递归和间接递归
直接递归方法自己调用自己
间接递归是A方法调用B方法,B方法调用C方法
注意事项:
1.递归要有限定条件,保证递归能停止,否则会发生栈内存溢出
2.在递归中不只要有限定条件,递归的次数也不能太多,否则也会发生栈内存溢出
3.构造方法,禁止递归
递归的使用前提:
当调用方法时,方法的主题不变,每次调用方法的参数不同,可以使用递归

package com.hqyj.demo06;

public class RecursionTest01 {
    public static void main(String[] args) {
        //a();
        b(1);
    }
    /*
    3.构造方法,禁止递归
     */
    public RecursionTest01() {
        //RecursionTest01();
    }

    /**
     *
     2.在递归中不只要有限定条件,递归的次数也不能太多,否则也会发生栈内存溢出
     *
     */
    private static void b(int i) {
        System.out.println(i);
        if(i==20000){
            return;
        }
        b(++i);
    }

    /*
    1.递归要有限定条件,保证递归能停止,否则会发生栈内存溢出
    Exception in thread "main" java.lang.StackOverflowError
     */
    private static void a() {
        System.out.println("a");
        a();
    }

}
package com.hqyj.demo06;
/*
练习:使用递归来计算1~n之间的和/n!
 */
public class RecursionTest02 {
    public static void main(String[] args) {
        int sum = sum(10);
        System.out.println(sum);
    }
    /*
    1+2+3+...+n
    n+(n-1)+(n-2)+...+1
    已知
    最大值:n 最小值:1
    使用递归必须明确:
    1.递归的结束条件:获取到1的时候结束递归
    2.递归获取下一个被加的数字n-1
     */
    public static int sum(int n){
        if(n==1){
            return 1;
        }
        return n+sum(n-1);
    }

}
package com.hqyj.demo06;

import java.io.File;

/*
练习:使用递归打印多级目录
需求:遍历D:\JDK\jdk1.8.0_212文件夹,以及D:\JDK\jdk1.8.0_212文件夹的子文件夹和子文件
只要:以.exe结尾的文件
 */
public class RecursionTest04 {
    public static void main(String[] args) {
        File f = new File("D:\\JDK\\jdk1.8.0_212");
        getAllFile(f);
    }
    public static void getAllFile(File dir){
        File[] files = dir.listFiles();
        for (File file : files) {
            if(file.isDirectory()){
                getAllFile(file);
            }else{
                if(file.getName().endsWith(".exe")){
                    System.out.println(file);
                }
            }
        }

    }
}

过滤器:——过滤器接口的实现类

package com.hqyj.demo06;

import java.io.File;

/*
过滤器:——过滤器接口的实现类
public interface FileFilter
boolean accept(File pathname)测试指定的抽象路径名是否应包含在路径名列表中。
public interface FilenameFilter
boolean accept(File dir,String name)测试指定文件是否应包含在文件列表中。
File类里面:
public File[] listFiles(FileFilter filter)
注意:这两个过滤器接口,是没有实现类,需要我们自己书写实现类,重写过滤方法accept()
在此方法来定义过滤规则
 */
public class RecursionTest05 {
    public static void main(String[] args) {
        File f = new File("D:\\JDK\\jdk1.8.0_212");
        getFile(f);
    }
    //定义方法遍历
    public static void getFile(File dir){
        File[] files = dir.listFiles(new FileFilterImpl());
        for (File file : files) {
            if(file.isDirectory()){
                getFile(file);
            }else{
                    System.out.println(file);
            }
        }

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

public class FileFilterImpl implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if(pathname.isDirectory()){
            return true;
        }
        return pathname.getName().endsWith(".exe");
    }
}

过滤器:——过滤器接口匿名内部类

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

/*
过滤器:——过滤器接口匿名内部类
 */
public class RecursionTest06 {
    public static void main(String[] args) {
        File f = new File("D:\\JDK\\jdk1.8.0_212");
        getAllFile(f);
    }
    public static void getAllFile(File dir){
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory()||pathname.getName().endsWith(".exe");
            }
        });
        for (File file : files) {
            if(file.isDirectory()){
                getAllFile(file);
            }else{
                System.out.println(file);
            }
        }
    }
}
posted @ 2021-08-22 22:26  勇敢的勇  阅读(51)  评论(0)    收藏  举报