File类

java.io.File类
文件和目录路径名的抽象表示形式。
java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作。
我们可以使用File类的方法

  • 创建一个文件/文件夹
  • 删除文件/文件夹
  • 获取文件/文件夹
  • 判断文件/文件夹是否存在
  • 对文件夹进行遍历
  • 获取文件的大小

File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法。
重点:记住这第三个单词

  • file——————文件
  • directory———文件夹/目录
  • path—————路径

File类的静态成员变量

  • static String pathSeparator——与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
  • static char pathSeparator——与系统有关的路径分隔符。
  • static String Separator——与系统有关的默认名称分隔符,它被表示为一个字符串。
  • static char Separator——与系统有关的默认名称分隔符。

绝对路径和相对路径

路径

  • 绝对路径————是一个完整的路径

以盘符(C:,D:)开始的路径
c:\a.txt
D:\java2019_5_13\Java\1-3-Java语言高级\06-File类与IO流\01 File类
c:\demo\b.txt

  • 相对路径————是一个简化的路径

相对指的是相对于当前项目的根目录(D:\java2019_5_13\Java\1-3-Java语言高级\06-File类与IO流\01 File类)
如果使用当前项目的根目录,路径可以简化书写
D:\java2019_5_13\Java\1-3-Java语言高级\06-File类与IO流\01 File类\1_8_1_01_File类的概述.avi–>简化为——1_8_1_01_File类的概述.avi(可以省略项目的根目录)
注意

  1. 路径是不区分大小写
  2. 路径中的文件名称分隔符widows使用反斜杠,放斜杠是转义字符,两个反斜杠代表一个普通反斜杠。

File类的构造方法

  • File(String pathname)——通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例。

参数
String pathname————字符串的路径名称
路径可以是以文件结尾,也可以是以文件夹结尾。
路径可以是相对路径,也可以是绝对路径。
路径可以是存在的,也可以是不存在的。
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。

  • File(String parent, String
    child)——根据parent路径名字符串和child路径名字符串来创建一个新的File实例。

参数————————把路径分成了两部分
String parent————父路径
String child—————子路径
好处
父路径和子路径可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。

  • File(File parent, String
    child)——根据parent路径名字符串和child路径名字符串来创建一个新的File实例。

好处
父路径和子路径可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
父路径是File类型,可以使用File的方法对路径进行一些操作,在使用路径创建对象。

File类获取功能的方法

  • public String getAbsolutePath()————返回此File的绝对路径名字符串。
    (无论路径是绝对的还是相对的,getAbsolutePath()方法返回的都是绝对路径)
  • public String getPath()————将此File转换为路径名字符串。
    (获取的构造方法中传递的路径)
  • public String getName()————返回此File标识的文件或目录的名称。
    (获取的就是构造方法传递路径的结尾部分(文件/文件夹))
  • public Long Lenth()————返回此File标识的文件的长度。
    (获取的是构造方法中指定的文件的大小,以字节为单位。
    注意——文件夹是没有大小概念的,不能获取文件夹的大小。如果构造方法中给出的路径不存在,那么length就返回0)

File类判断功能的方法

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

File类创建删除功能的方法

  • public boolean creatNewFile()——当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
    (creatNewFile声明抛出了IOException,我们调用这个方法,就必须处理这个异常,要么throws,要么try catch)
  • public boolean delete()——删除由此File表示的文件或目录。
    (此方法,可以删除构造方法路径中给出的文件/文件夹。注意delete方法直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎。)
  • public boolean mkdir()——创建由此File表示的目录。
    (创建单级空文件夹)
  • public boolean mkdirs()——创建由此File表示的目录,包括任何必需但不存在的父目录。
    (既可以创建单级空文件夹,也可以创建多级文件夹)

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

  • public String[ ] list( )——返回一个String数组,表示该File目录中的所有子文件或目录。
  • public File[ ] listFiles( )——返回一个File数组,表示该File目录中的所有子文件或目录。
    注意
  • list方法和listFiles方法遍历的是构造方法中给出的目录。
  • 如果构造方法中给出的目录的路径不存在,会抛出空指针异常。
  • 如果构造方法中给出的路径不是一个目录,也会抛出空指针异常。

FileFilter过滤器的原理和使用

在File类中有两个和lisFiles重载的方法,方法的参数传递的就是过滤器。
File[ ]listFiles(FilesFilter filter)
java.io.FilesFilter 接口————用于抽象路径名(File对象)的过滤器。
作用————————用来过滤文件(File对象)

  • 抽象方法——————用来过滤文件的方法。
  • boolean accept(File pathname)—————测试指定抽象路径是否应该包含在某个路径名列表中。

参数
File pathname———使用listFiles方法遍历目录,得到的每一个文件对象。
Filt[ ]lisFiles(FilenameFilter filter)
java.io.FilenameFilter 接口————实现此接口的类实例可用于过滤文件名。
作用————————用来过滤文件(File对象)

  • 抽象方法—————用来过滤文件的方法。
  • boolean accept(File dir String name)—————测试指定文件是否应该包含在某一文件列表中。
    参数
    File dir ——————构造方法中传递的被遍历的目录
    String name————使用lisFiles方法遍历目录,获取每一个文件/文件夹的名称。
    注意
    两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则。

练习

package cn.lrf.DiGuiDemo;

import java.io.File;

/*练习
 * 递归打印多级目录
 * 需求
 * 遍历D:\java2019_5_13\图片文件夹,及文件夹的子文件夹
 * D:\java2019_5_13\图片
 * 只要.jpg结尾的文件*/
public class Demo05Recurison {
    public static void main(String[] args) {
        File file = new File("D:\\java2019_5_13\\图片");
        getAllFile(file);
    }

    /*定义一个方法,参数传递File类型的目录
     * 方法中对目录进行遍历*/
    public static void getAllFile(File dir) {
        File[] files = dir.listFiles(new FileFilterImpl());//传递过滤器对象
        for (File f : files) {
            //对遍历得到的File对象f进行判断,判断是否是文件夹
            if (f.isDirectory()) {
                //f是一个文件夹,则继续遍历这个文件夹
                //我们发现getAllFile方法就是传递文件夹,遍历文件夹的方法
                //所以直接调用getAllFile方法即可——递归(自己调用自己)
                getAllFile(f);
            } else {
                    System.out.println(f);
                }
            }
        }
    }
package cn.lrf.DiGuiDemo;

import java.io.File;
/*
* 创建过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则*/
public class FileFilterImpl implements java.io.FileFilter{
    @Override
    public boolean accept(File pathname) {
        /*
        * 过滤的规则
        * 在accept方法中,判断file对象是否以.jpg结尾
        * 是就返回true
        * 不是就返回false*/
        //如果pathname是一个文件夹,返回true,继续遍历这个文件夹
        if (pathname.isDirectory()){
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(".jpg");
    }
}

FileNameFilter过滤器的使用和Lambda表达式

package cn.lrf.DiGuiDemo;

import java.io.File;

/*练习
 * 递归打印多级目录
 * 需求
 * 遍历D:\java2019_5_13\图片文件夹,及文件夹的子文件夹
 * D:\java2019_5_13\图片
 * 只要.jpg结尾的文件*/
public class Demo06Recurison {
    public static void main(String[] args) {
        File file = new File("D:\\java2019_5_13\\图片");
        getAllFile(file);
    }

    /*定义一个方法,参数传递File类型的目录
     * 方法中对目录进行遍历*/
    public static void getAllFile(File dir) {
        //传递过滤器对象,使用匿名内部类
       /* File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {

                 //过滤的规则,如果pathname是一个文件夹或则是是否以.jpg结尾的文件就返回true
                return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".jpg");
            }
        });*/
        //使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)
      /*  File[] files = dir.listFiles((File pathname) -> {

            //过滤的规则,如果pathname是一个文件夹或则是是否以.jpg结尾的文件就返回true
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".jpg");

        });*/
        File[] files = dir.listFiles(( pathname) -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".jpg") );
      /*  File[] files = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                //过滤的规则,如果pathname是一个文件夹或则是是否以.jpg结尾的文件就返回true

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

        });*/
        //File[] files = dir.listFiles(( d, name)->new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".jpg"));
        for (File f : files) {
            //对遍历得到的File对象f进行判断,判断是否是文件夹
            if (f.isDirectory()) {
                //f是一个文件夹,则继续遍历这个文件夹
                //我们发现getAllFile方法就是传递文件夹,遍历文件夹的方法
                //所以直接调用getAllFile方法即可——递归(自己调用自己)
                getAllFile(f);
            } else {
                System.out.println(f);
            }
        }
    }
}

File类_第1张图片

你可能感兴趣的:(Java语言高级)