42.File类

一、File类概述

包位置:java.io.File:

File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、删除、获取、判断、遍历、获取大小;File类是一个与操作系统无关的一个类

1.File类操作系统相关分割符静态成员变量:(省略static)

  • String pathSeparator : 操作系统相关路径分隔符,字符串表示【windows:分号; linux:冒号:
  • char pathSeparatorChar: 操作系统有关的路径分隔符,字符表示
  • String separator :与系统有关的默认分隔符,字符串表示。【文件名称分隔符 windows:反斜杠\ linux:正斜杠/
  • char separatorChar: 系统相关的默认名称分隔符,字符表示
/*
操作路径:路径不能写死了
C:\develop\a\a.txt  windows
C:/develop/a/a.txt  linux
"C:"+File.separator+"develop"+File.separator+"a"+File.separator+"a.txt"
 */

System.out.println(File.pathSeparator);//路径分隔符 windows:分号;  linux:冒号:
System.out.println(File.separator);// 文件名称分隔符 windows:反斜杠\  linux:正斜杠/

2.绝对路径与相对路径

  • 绝对路径:从盘符开始的路径,这是一个完整的路径。
  • 相对路径:相对于项目目录的根路径,这是一个便捷的路径,开发中经常使用。(C:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt-->简化为: 123.txt(可以省略项目的根目录))

注意:

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

二、构造方法

构造方法:(省略public)

  • File(String pathname) : 路径名字符串 --> 抽象路径 --> new File 实例
  • File(String parent, String child): 父路径名字符串+子路径名字符串 --> new File 实例
  • File(File parent, String child) :父抽象路径名+子路径名字符串 --> new File 实例
/** 绝对路径与相对路径参数:
  String pathname:字符串的路径名称
    1.路径可以是以文件结尾,也可以是以文件夹结尾
    2.路径可以是相对路径,也可以是绝对路径
    3.路径可以是存在,也可以是不存在
    4.创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况*/
/*绝对路径*/
String pathname1 = "G:\\picture\\feifei.jpg";
File file1 = new File(pathname1);

/*相对路径*/
String parthname2 = ".\\moduleName\\fiefei.jpg";
File file2 = new File(parthname2);
  • 父路径和子路径拼接
/**@父路径和子路径拼接
好处:
    父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化*/
String parent3 = "G:\\picture";
String child3 = "feifei.jpg";
File file3 = new File(parent3, child3);
  • 父级File对象(文件夹路径) + 总路径字符串
/** @父级File对象(文件夹路径) + 总路径字符串
好处:
   1.父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化
   2.父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象*/
File parentDir4 = new File("G:\\picture");
String child4 = "feifei.jpg";
File file4 = new File(parentDir4, child4);

1.一个File对象代表硬盘中实际村子的一个文件或者目录
2.无论该路径下时候存在文件或者目录,都不影响File对象的创建。

三、常用功能

1.一般功能(省略public)

  • String getAbsolutePath() : 返回此File的绝对路径名 字符串。
    • 返回盘符文件后缀名或者末文夹件名之间的字符串
  • String getPath() : 返回此File转换为路径名的字符串
    • 返回构造路径new File对象时传入的参数形式(相对或者绝对)
    • toString方法调用的就是getPath方法
  • String getName() :返回由此File表示的文件或者目录的名称。
    • 获取的就是构造方法传递路径结尾部分(文件/文件夹)
  • String long length() :返回由此File表示的文件的长度。
    1. 获取的是构造方法指定的文件的大小,以字节为单位
    2. 文件夹是没有大小概念的,不能获取文件夹的大小
    3. 如果构造方法中给出的路径不存在,那么length方法返回0
  • String getParent():得到父路径!

2.判断功能的方法(省略public)

  • boolean exists() : 返回此File表示的文件或者目录是否实际存在
  • boolean isDirectory(): 判断此File表示的是否为目录(文件夹结尾)
  • boolean isFile() : 判断此File是否为文件(文件结尾)。

    1.电脑的硬盘中只有文件/文件夹,两个方法是互斥
    2.这两个方法使用前提,路径必须是存在的,否则都返回false

3.创建删除功能方法(省略public)

  • boolean createNewFile: 当且仅当该名称的文件尚不存在时,创建一个新的空文件(构造方法的参数)【创建文件的路径必须存在】。(操作文件夹无效)

    • 返回值:布尔值
      true:文件不存在,创建文件,返回true
      false:文件存在,不会创建,返回false

    • 注意:创建文件的路径必须存在,否则会抛出异常,而且必须处理IOException异常

    public boolean createNewFile() throws IOException
    createNewFile声明抛出了IOException,我们调用这个方法,就必须的处理这个异常,要么throws,要么trycatch

  • boolean delete() : 删除由此File表示的文件或者目录

    • 如果此File表示目录,则目录必须为空才能删除。
      - >删除构造方法路径中给出的文件/文件夹【末尾文件或者末尾文件夹
      - >布尔值
      true:文件/文件夹删除成功
      false:文件夹中有内容,不会删除
      构造方法中路径不存在
      - >注意:delete方法是直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎

  • boolean mkdir() : 创建由此File表示的目录。(操作文件无效)

  • boolean mkdirs() :【推荐使用】创建由此File表示的目录,包括任何必须但是不存在的父目录。

    • 返回值:布尔值
      true:文件夹不存在,创建文件夹
      false:文件夹存在,不会创建;
      构造方法中给出的路径不存在
      - >注意:此方法只能创建出文件夹,不能创建文件

4.目录(目录对象)的遍历(省略public)

  • String[] list() : 返回String数组,该File目录下的所有子文件或目录。
  • File[] listFiles() : 返回一个File数组,该File目录下的所有的子文件或目录
    • 调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
      - >注意:
      1.如果构造方法中给出的目录的路径不存在,会抛出空指针异常
      2.如果构造方法中给出的路径不是一个目录,也会抛出空指针异常

返回相关目录下文件夹或文件的数组

File file = new File("day_08");
String[] fileSon = file.list();
System.out.println(Arrays.toString(fileSon));
// [day_08.iml, feifei.jpg, src]

5.文件过滤器优化【有文件夹则递归寻找】【配合使用->dir.listFiles(lambda)

  • java.io.FileFilter是一个File过滤器。该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,接口中只有一个方法
    • boolean accept(File pathname) :测试pathname是包含在当前File目录中,符合则返回true
// 创建一个dir文件
File dir = new File(".\\day_08");

// 使用匿名函数的方式
File[] array = dir.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return pathname.isDirectory() || pathname.getName().endsWith(".java");
    }
});

// 使用lambda的方式
File[] array2 = dir.listFiles(
        pathname -> pathname.isDirectory()
                || pathname.getName().endsWith(".java"));

6.文件过滤器优化【非递归寻找】【配合使用->dir.listFiles(lambda)

  • java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名
  • boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。
    • File dir:构造方法中传递的被遍历的目录【文件所在目录文件,不含末尾文件/文件名】
    • String name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
File[] array = new File(".\\learnSelf").listFiles(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        System.out.println(dir); //  .\\learnSelf
        return name.toLowerCase().endsWith("java");
    }
});

for (File file : array) {
    System.out.println(file.getName());
}

综合案例 递归访问一个文件夹下面所有的文件夹或者文件(有color)

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

public class Main {

    public static void main(String[] args) throws IOException {
       File file = new File(".");
       System.out.println(file.getName());
       showFile(file, 0, "");
    }

    public static boolean showFile(File file, int depth, String fatherSpace) {
        // 记录当前递归是否打印了前置空白,从而显示得不太宽松
        boolean printed = false;

        // 递归打印当前文件夹下的文件和文件夹
        File[] filesList = file.listFiles();
        File file1;
        String current = "";
        for (int i = 0; i < filesList.length; i ++) {
            file1 = filesList[i];

            System.out.print(fatherSpace + "   |");

            // 计算下一个递归需要的前置空白
            if(i == filesList.length - 1) {
                current = fatherSpace + "    ";
            } else {
                current = fatherSpace + "   |";
            }

            if(file1.isDirectory()) {
                // 打印当前的文件夹名称
                System.out.println("\033[34;1m-[D]\033[0m" + "\033[36;2m" + file1.getName() + "\033[0m");

                // 递归遍历此文件夹
                printed = showFile(file1, depth + 1, current);
            } else {
                System.out.println("\033[31;1m-[F]\033[0m" + "\033[35;2m" + file1.getName() + "\033[0m");
            }

            // 当前列表结束打印一个父级空白,从而显得不拥挤
            if(i == filesList.length - 1 && !printed) {
                System.out.println(fatherSpace);
                return true;
            }
        }
        return printed;
    }
}

你可能感兴趣的:(42.File类)