File类、递归

  • 时间:
  • 浏览:
  • 来源:互联网

File类

概述

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
Filel类是一个与操作系统无关的类,任何操作系统都可以使用这个类的方法

分隔符方法

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

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

操作路径(路径不能写死了):
C:\JAVA\a\a.txt windows
C:/JAVA/a/a.txt linux
"C:+File.separator+“JAVA”+File.separator+“a”+File.separator+"a.txt "

路径:

绝对路径:是一个完整的路径
以盘符(c:,d:)开始的路径
C:\JAVA\a\a.txt
相对路径:是一个简化的路径
相对是指相对于当前项目的根目录,路径可以简化书写
C:\JAVA\a\a.txt–>简化为a.txt
注意
1、路径是不区分大小写
2、路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

构造方法

package FileTest;
import java.io.File;

/*File构造方法*/

public class FileConstructMethod {
    public static void main(String[] args) {
        //1、通过文件名字符串转换为抽象路径名来创建新的对象
        String pathName ="c:\\aaa.txt";
        File file = new File(pathName);

        String pathName1 ="c:\\aaa\\bbb.txt";
        File file1 = new File(pathName);

        //2、通过通过父路径和子路径字符串
        File fileParent = new File("D://aaa");
        String child ="bbb.txt";
        File file2 = new File(fileParent,child);
        System.out.println(file2);

        //3、通过父级File和子级字符串
        File parentDir = new File("D://AAA");
        String child1 ="BBB.txt";
        File file3 = new File(parentDir,child1);
        System.out.println(file3);
    }
}

常用方法

判断

public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile() :此File表示的是否为文件。

删除

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

package FileTest;

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

public class FileMethodsTest {
    public static void main(String[] args) throws IOException {
        //判断
        File f1= new File("d:\\a\\a.java");
        File f2= new File("d:\\b");
        //判断是否存在
        System.out.println(f1.exists());
        System.out.println(f1.exists());
        //判断是文件还是目录
        System.out.println(f2.isFile());
        System.out.println(f2.isDirectory());

        //创建删除
        //文件的创建
        File f3 =new File("aaa.txt");
        System.out.println(f3.exists());
        System.out.println(f3.createNewFile());
        System.out.println(f3.exists());

        //目录的创建
        File f4 = new File("newDir");
        System.out.println(f4.exists());
        System.out.println(f4.mkdir());
        System.out.println(f4.exists());

        //创建多级目录
        File f5 = new File("newDira\\newDifb");
        System.out.println(f5.mkdir());
        System.out.println(f5.mkdirs());

        //文件的删除及目录的删除(delete()方法直接在硬盘中删除,不走回收站,删除需谨慎)
        System.out.println(f3.delete());
        System.out.println(f5.delete());
    }
}

目录的遍历

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

package FileTest;

import java.io.File;

public class FileBianli {
    public static void main(String[] args) {
        File dir = new File("D:\\DingDing");
        //获取当前目录文件及文件夹名称
        String[] names = dir.list();
        for (String name:names){
            System.out.println(name);
        }
        //获取当前文件及文件夹对象,返回的是一个File数组
        //ListFiles方法的File对象,表示的是实际存在的目录,否则返回null无法遍历
        File[] files = dir.listFiles();
        for (File file:files){
            System.out.println(file);

        }


    }
}

递归

概述

递归:指在当前方法内调用自己的这种现象。
递归的分类:
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
构造方法,禁止递归

递归求和

需求:计算1 ~ n的和

package DiGuiTest;
/*
练习:使用递归计算1+n的和
分析:
先定义一个方法,使用递归计算1+n的和
1+2+3+...+n
等效于n+(n-1)+(n-2)+...+1
已知:
最大值:n
最小值:1
使用递归必须明确:
1、递归的结束条件
   获取到1时结束
2、递归的目的:
   获取下一个被加的数字(n-1)
*/


public class SumTest {
    public static void main(String[] args) {
        int num = 5;
        int result =getSum(num);
        System.out.println(result);
    }

    private static int getSum(int num) {
        if(num==1){
            return 1;
        }

        return num+getSum(num-1);
    }
}

递归打印多级目录

分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实
现。

package DiGuiTest;

import java.io.File;

public class GetFiles {
    public static void main(String[] args) {
        File dir = new File("F:\\TestJava");
        getAllFiles(dir);
    }

    private static void getAllFiles(File dir) {
        File[] files=dir.listFiles();
        for (File file:files){
            //对遍历得到的File对象进行判断,判断是否是文件夹
            //getAllFiles()方法就是传递文件夹,遍历文件夹的方法
            //所以直接调用getAllFiles()方法即可,递归(自己调自己)
            if (file.isDirectory()){
                getAllFiles(file);
            }else {
                //file是一个文件直接打印即可
                System.out.println(file);
            }

        }

    }
}

综合案例

文件搜索

package DiGuiTest;

import java.io.File;

public class GetDirectFile {
    public static void main(String[] args) {
        File dir = new File("F:\\TestJava");
        getDirect(dir);
    }

    private static void getDirect(File dir) {
        File[] files = dir.listFiles();
        for (File file:files){
            if (file.isFile()){
                //是文件,判断文件名并输出
                if (file.getName().endsWith(".java")){
                    System.out.println(file);
                }

            }else {
                //是目录,继续遍历形成递归
                getDirect(file);
            }
        }


    }
}

文件过滤器优化

在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器

  1. File[] listFiles(FileFilter filter)
    **java.io.FileFilter接口:**用于抽象路径名(File对象)的过滤器。
    作用:用来过滤文件(File对象)
    抽象方法:用来过滤文件的方法
    boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
    参数:
    File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象

  2. File[] listFiles(FilenameFilter filter)
    java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名。
    作用:用于过滤文件名称
    **抽象方法:**用来过滤文件的方法
    boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。
    参数:
    File dir:构造方法中传递的被遍历的目录
    **String name:**使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
    注意:
    两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则

普通方法

package DiGuiTest;

import java.io.File;

public class FileFilterImpl implements java.io.FileFilter {

    @Override
    public boolean accept(File pathname) {
        /*过滤规则:
        在accept方法中判断File对象是否以".Java"结尾
        是则返回true
        不是则返回false
        如果pathname是一个文件夹,返回true 继续遍历这个文件夹
        */
        if (pathname.isDirectory()){
            return true;
        }else
            return pathname.getName().toString().toLowerCase().endsWith(".java");
    }
}

package DiGuiTest;

import java.io.File;

public class FileFilterDemo {
    public static void main(String[] args) {
        File dir = new File("F:\\TestJava");
        getAllFiles(dir);

    }

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

        }
    }


}

匿名内部类及Lambda表达式

package DiGuiTest;

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

public class FileFilterDemo01 {
    public static void main(String[] args) {
        File dir = new File("F:\\TestJava");
        getAllPathFiles(dir);
    }

    private static void getAllPathFiles(File file) {
        //传递过滤器对象--FileFilter,使用匿名内部类
/*
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                //过滤规则,pathname是文件夹或者是.java结尾的文件返回true
                return pathname.isDirectory() || pathname.getName().toString().toLowerCase().endsWith(".java");
            }
        });
*/
        //传递过滤器对象--FilenameFilter,使用匿名内部类
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".java");
            }
        });


      /*  //使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)--FileFilter
        File[] files1 = file.listFiles(pathname->{
            return pathname.isDirectory() || pathname.getName().toString().toLowerCase().endsWith(".java");
        });
        //进一步优化
        File[] files2 = file.listFiles(pathname->
            pathname.isDirectory() || pathname.getName().toString().toLowerCase().endsWith(".java"));*/

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


        for (File pathFile : files) {
            if (pathFile.isDirectory()) {
                getAllPathFiles(pathFile);
            } else {
                System.out.println(pathFile);
            }



        }


    }


}

本文链接http://metronic.net.cn/metronic/show-22204.html