欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java-File类、递归-第19节

程序员文章站 2022-06-17 09:05:05
...

学习目标:

  • 熟练使用File类,能够实现创建与删除文件文件夹操作;
  • 掌握常用的搜索文件夹或者文件的方法;
  • 理解递归的概念,并熟练使用递归完成搜索工作。

学习内容:

一、File类

  • 1、简介

    a、java.io.File
    b、对文件或文件夹(目录)的封装类
    
  • 2、主要功能

    a、创建文件、文件夹
    b、删除文件、文件夹
    c、查找文件、文件夹
    d、判断是否存在文件、文件夹
    e、遍历文件夹(目录)
    f、获取文件的大小
    
  • 3、静态成员变量

    a、pathSeparator
    	-	Static String pathSeparator;
    	-	路径分隔符,window-; linux-:
    b、pathSeparatorChar
    	-	Static Char pathSeparatorChar;
    	-	转换成字符的路径分隔符
    c、fileSeparator
    	-	Static String fileSeparator;
    	-	文件夹名称分隔符,window-\  linux-/
    PS:
    	程序中的路径不能写死---->
    	"c:"+File.fileSeparator+"File"+File.fileSeparator+"name"
    
  • 4、路径

    a、路径不区分大小写
    b、windows中路径的文件名称用反斜杠分割,反斜杠是转义字符,两个反斜杠表示一个普通的反斜杠
    
  • 5、构造方法

    a、File(String pathString);				# 创建对应字符串路径的文件对象
    b、File(String parent, String child);	# 将字符串路径分为父与子两部分进行拼接
    c、File(File parent, String child);		# 将字符串路径分为父类文件对象与子类字符串进行拼接
    
  • 6、成员方法

    a、获取类功能
    	-	public String getAbsolutePath();	# 获取绝对路径
    	-	public String getPath();			# 获取File对象传递的路径
    	-	public String getName();			# 获取文件或文件夹的名字
    	-	public Long length();				# 获取文件的大小(kb)
    		注意:文件夹与不存在的路径的大小都是0
    b、判断类功能
    	-	public boolean exists();			# 判断路径是否存在
    	-	public boolean isDirectory();		# 判断是不是文件夹
    	-	public boolean isFile();			# 判断是不是文件
    	注意:
    		如果路径不存在,下面的两个判断都是false
    c、创建删除功能
    	-	public boolean createNewFile();		# 创建文件,如果存在不创建,返回false
    														如果创建文件的路径不存在,抛出异常
    	-	public boolean mkdir();				# 创建目录,单级目录
    	-	public boolean mkdirs();			# 创建目录,单级或多级目录
    	-	public boolean delete();			# 删除文件或文件夹,文件夹有内容不会删除,而且是不经过
    												回收站的直接删除
    d、遍历功能
    	-	public String[] list();				# 遍历目录下的所有文件与文件夹,并转换成字符串数组
    	-	public File[] listFiles();			# 遍历目录下的所有文件与文件夹,并转换成File对象数组
    	注意:
    		-	当目录不存在或者是一个文件时,会报空指针异常
    		-	两种方法都可以显示隐藏起来的文件与文件夹
    

二、递归

  • 1、简介

    a、概念
    	自己调用自己
    b、分类
    	-	直接递归:自己调用自己
    	-	间接递归:A调用B,B调用C,C调用A
    c、注意事项
    	-	递归一定要有条件限制,保证其能够停下来,防止发生栈内存溢出;
    

Java-File类、递归-第19节

		-	递归的次数不能太多,否则也会发生栈内存溢出;
		-	构造方法,禁止递归。
	d、使用前提
		-	调用方法时,主体不变,参数变化

学习产出:

1、File 静态成员变量

package mypackage.day15.demo01;

import java.io.File;

public class FileStaticVar {
    public static void main(String[] args) {
        System.out.println(File.separator);
        System.out.println(File.separatorChar);
        System.out.println(File.pathSeparator);
        System.out.println(File.pathSeparatorChar);
        System.out.println("C:"+File.separator+"a.txt");
    }
}


2、File构造方法

package mypackage.day15.demo01;

import java.io.File;

public class FileConstruct {
    public static void main(String[] args) {
        construct1();
        construct2();
        construct3();
    }

    private static void construct3() {
        File subfile = new File("D:\\Aplication\\WeChat\\StoreFile");
        File file = new File(subfile, "WeChat Files\\wxid_nqv5pfqxwpdh21\\FileStorage\\File\\2020-10");
        System.out.println(file);
    }

    private static void construct2() {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile",
                "WeChat Files\\wxid_nqv5pfqxwpdh21\\FileStorage\\File\\2020-10");
        System.out.println(file);
    }

    private static void construct1() {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile" +
                "\\WeChat Files\\wxid_nqv5pfqxwpdh21\\FileStorage\\File\\2020-10");
        System.out.println(file);

    }
}

3、 File成员方法

package mypackage.day15.demo02;

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

public class FileMemberMethod {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile");
        System.out.println("====get====");
        mem1(file);
        System.out.println("====judge====");
        mem2(file);
        System.out.println("====create and delete====");
        mem3(file);
        System.out.println("====look====");
        mem4();
    }

    private static void mem4() {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
        String[] list = file.list();
        for (String s : list) {
            System.out.println(s);
        }
        File[] files = file.listFiles();
        for (File file1 : files) {
            System.out.println(file1);
        }
    }

    private static void mem3(File file) throws IOException {
        File file1 = new File(file, "\\test\\abc");
        System.out.println(file1.mkdirs());
        System.out.println(file1.mkdir());
        System.out.println(file1.createNewFile());
        System.out.println(file1.delete());
    }

    private static void mem2(File file) {
        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }

    private static void mem1(File file) {
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getPath());
        System.out.println(file.getName());
        System.out.println(file.length());
    }
}

4、练习:使用递归计算1-n之间的和
Java-File类、递归-第19节

package mypackage.day15.demo03;

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

public class RecursionExecise1 {
    public static void main(String[] args) {
        int sum = sum(100);
        System.out.println(sum);
    }

    private static int sum(int i) {
        if (i==1){
            return 1;
        }
        return i+sum(i-1);
    }
}

5、练习:使用递归计算n的阶乘

package mypackage.day15.demo03;

public class RecursionExecise2 {
    public static void main(String[] args) {
        int jiecheng = jc(5);
        System.out.println(jiecheng);
    }

    private static int jc(int i) {
        if (i==1){
            return 1;
        }
        return i*jc(i-1);
    }
}

6、练习:递归打印多级目录
Java-File类、递归-第19节

package mypackage.day15.demo03;

import java.io.File;



public class RecursionExecise3 {
    public static void main(String[] args) {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
        getFilesName(file);
    }

    private static void getFilesName(File file) {
        System.out.println(file);
        if (file.isDirectory()){
            File[] files = file.listFiles();
            for (File file1 : files) {
                if (file1.isDirectory()){
                    getFilesName(file1);
                }else {
                    System.out.println(file1);
                }
            }
        }
    }
}

7、练习:文件搜索

package mypackage.day15.demo03;

import java.io.File;


public class RecursionExecise4 {
    public static void main(String[] args) {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
        findFilesName(file);
    }

    private static void findFilesName(File file) {
        if (file.isDirectory()){
            File[] files = file.listFiles();
            for (File file1 : files) {
                if (file1.isDirectory()){
                    findFilesName(file1);
                }else {
                    if (file1.toString().endsWith(".jpg")){
                        System.out.println(file1);
                    }
                }
            }
        }
    }
}

8、过滤器的使用
Java-File类、递归-第19节

package mypackage.day15.demo03;

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


public class RecursionExecise5 {
    public static void main(String[] args) {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
        findFilesName(file);
    }

    private static void findFilesName(File file) {
        File[] files1 = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.isDirectory()){
                    findFilesName(pathname);
                    return false;
                }else {
                    if (pathname.toString().endsWith(".jpg")){
                        return true;
                    }
                    return false;
                }
            }
        });
        for (File file1 : files1) {
            System.out.println(file1);
        }
    }
}

9、练习:用过滤器进行文件搜索

package mypackage.day15.demo03;

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


public class RecursionExecise6 {
    public static void main(String[] args) {
        File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
        findFilesName(file);
    }

    private static void findFilesName(File file) {
//        File[] files1 = file.listFiles(new FilenameFilter() {
//            @Override
//            public boolean accept(File dir, String name) {
//                File pathname = new File(dir, name);
//                if (pathname.isDirectory()){
//                    findFilesName(pathname);
//                    return false;
//                }else {
//                    if (pathname.toString().endsWith(".jpg")){
//                        return true;
//                    }
//                    return false;
//                }
//            }
//        });
        File[] files1 = file.listFiles((dir, name)->{
                return dir.toString().endsWith(".jpg") || name.endsWith(".jpg");
            }
        );
        for (File file1 : files1) {
            System.out.println(file1);
        }
    }
}