week03_day06_File

设置工作目录:
week03_day06_File_第1张图片
后点击Edit Configuration
week03_day06_File_第2张图片
Working directory:就是当前工作目录,我们可以对其进行修改,可以改成$MODULE_WORKING_DIR,表示改到当前目录。

为什么学习File类?
因为操作系统中,所有需要永久保存的数据,都是以文件的形式存在。
File类概述:文件和目录 路径名 的 抽象表达形式
注意:抽象 和 物理存在相对

File类对象表示的就等价于一个 路径名 所表示的文件或者目录
路径:

  1. 绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的 文件或目录。如:windows:E:\first\a.txt
  2. 相反,相对路径名必须使用取自其他路径名的信息进行解释(相对路径本身表示信息不完整)。如:windows: dir\a.txt

3. 默认情况下,java.io包中的类总是根据当前用户目录来解析相对路径名。
此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。如:E:\wangdao\22th\file\ + dir\a.txt

路径表示:
1.对于 UNIX 平台,绝对路径名的前缀始终是 “/”。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/” 且名称序列为空。所有的文件都或直接或间接的存在于根目录下,和Windows中的C盘、D盘不一样
绝对路径表示: /data/a.log
相对路径:home/6379.conf
/: 表示根目录

2.对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 “\”,而相对路径没有盘符前缀
绝对路径: E:\first\dir\a.txt
相对路径: 没有盘符前缀的路径 dir\a.txt

  • File的构造方法:
    File (String pathname) //以一个路径名字符串,创建File对象,该File对象就表示该路径名字符串路径,所表示的操作系统的目录或文件
    File (String parent, Sting child) //是以相对路径的形式,创建File对象
    File (File parent, String child)

····················································································································································································································

创建功能
public boolean createNewFile() //物理创建文件(并不能创建目录)

创建目录
public boolean mkdir()
public boolean mkdirs()

mkdir 和 mkdirs创建目录的区别:

  1. mkdir仅能在已经存在的目录下,创建新的目录
  2. mkdirs 当要创建的目标目录,如果目标目录的父目录不存在的时候,它会将不存在的目标目录的父目录,连同目标目录一起,都创建好

删除功能
public boolean delete() 删除文件
如果此路径名表示一个文件,则直接删除即可。
如果此路径名表示一个目录,则该目录必须为空才能删除。

重命名功能
public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。

import java.io.File;

public class Demo04Rename {
     

    public static void main(String[] args) {
     

        File file = new File("e:\\first\\a.txt");
        // 重命名 e:\first\b.txt

        // 当目标File对象所表示抽象路径如果和原文件,的路径在同一目录下,该方法实现的效果仅仅只是重命名
        boolean b = file.renameTo(new File("e:\\first\\b.txt"));
        // 当目标File对象所表示抽象路径如果和原文件,的路径不在同一目录下,该方法实现的效果 文件移动 + 重命名
        b = file.renameTo(new File("e:\\second\\bbbbbb.txt"));
        System.out.println(b);

    }

}

····················································································································································································································

判断功能

  • public boolean isFile() //判断file对象表示的是否是一个文件
  • public boolean isDirectory() //判断file对象表示的是否是一个目录
    File对象既可以是一个目录,也可是一个文件
  • public boolean exists() // 判断,file对象所表示的文件或目录是否物理存在
  • public boolean canRead() // 判断,该file对象所表示的文件目录是否有读取权
  • public boolean canWrite()
  • public boolean isHidden() //判断目标文件是否是隐藏文件

基本获取

  • public File **getAbsoluteFile() **//获取一个用绝对路径表示抽象路径名的File对象
  • public String getAbsolutePath()//获取一个用绝对路径(相比起getAbsoluteFile一般用getAbsolutePath)
  • public String getPath()
    //在用相对路径名表示的File对象上调用其getPath()方法得到的是相对路径
    //在用绝对路径名表示的File对象上调用其getPath()方法得到的是绝对路径
  • public String getName()
  • public long length()
  • public long lastModified()

····················································································································································································································
高级获取功能:

  • public String[] list() 仅返回当前目录下的子文件或子目录的名称
    1.返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的 文件 和 目录 (其实返回的就是当前目录下的所有目录或文件的名字)。
    2.如果此抽象路径名不表示一个目录,那么此方法将返回 null

  • public File[] listFiles() 仅返回当前目录下的子文件或子目录的名称
    //返回的是File[],相比较String[],返回的内容会更全面,所以开发中常用listFiles()

  1. 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
  2. 如果此抽象路径名不表示一个目录,那么此方法将返回 null。如果目录为空,会返回一个空数组:[ ]。

自定义获取功能

  • File[] listFiles(FileFilter filter)
  • FileFilter:表示过滤器的接口
    public interface FileFilter {
    // 判断,参数File对象所表示的目录或者文件,是否满足过滤条件
    boolean accept(File pathname);
    }

一个FileFilter对象,表示一种具体的过滤条件
当我只想要得到,表示当前目录下,满足特殊条件的文件或者目录对应的File对象。如果我只想的到,.txt文件对应的File对象

public class Demo08HighBasic02 {
     

    public static void main(String[] args) {
     

        // E:\\dir\\log.txt

        // 用匿名内部类对象,表示一个FileFilter子类对象
        FileFilter filter = new FileFilter() {
     
            @Override
            public boolean accept(File file) {
     
                String name = file.getName();
                boolean isTxt = name.endsWith(".txt");
                return file.isFile() && isTxt;
            }
        };

        File dir = new File("e:\\dir");
        File[] files = dir.listFiles(filter);
        System.out.println(Arrays.toString(files));
    }

}

····················································································································································································································

作业:

  1. 递归删除目录 (相当于数的后序遍历,先删除孩子结点,再删除父节点)
package com.cskaoyan;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Arrays;

/**
 * @author shihao
 * @create 2020-04-26 11:08
 */
public class Homework01 {
     

    public static void main(String[] args) throws IOException {
     
        //创建目录
        create();

        //查找txt文件
        File file = new File("F:\\dir");
        findTxt(file);

        //删除目录及目录里的文件
        deleteAll(file);

    }

    private static void create() throws IOException {
     
        File file = new File("F:\\dir");
        if (!file.exists()) {
     
            file.mkdir();
        }

        //在dir下创建第一层目录
        for (int i = 1; i <= 4; i++) {
     
            String path = file.getAbsolutePath() + "\\file" + i;
            File f = new File(path);
            if (!f.exists()) {
     
                f.mkdir();
            }
        }
        File file1 = new File("F:\\dir\\my.txt");
        file1.createNewFile();

        //创建第二层目录
        for (int i = 1; i <= 4; i++) {
     
            File f = new File("F:\\dir\\file" + i + "\\floor2\\floor3");
            if (!f.exists()) {
     
                f.mkdirs();
            }
        }

        file1 = new File("F:\\dir\\file1\\floor2\\my1.txt");
        if (!file1.exists()) {
     
            file1.createNewFile();
        }
        file1 = new File("F:\\dir\\file3\\floor2\\my3.txt");
        if (!file1.exists()) {
     
            file1.createNewFile();
        }
        file1 = new File("F:\\dir\\file4\\floor2\\floor3\\my4.txt");
        if (!file1.exists()) {
     
            file1.createNewFile();
        }
    }

    //查找txt文件
    public static void findTxt(File file) {
     
        FileFilter fileFilter = new FileFilter() {
     
            @Override
            public boolean accept(File file) {
     
                String pathname = file.getName();
                if (pathname.endsWith(".txt") && file.isFile()) {
     
                    return true;
                }
                return false;
            }
        };

        File[] files = file.listFiles(fileFilter);
        System.out.println(Arrays.toString(files));
    }

    //删除目录及目录里的文件
    public static void deleteAll(File file) {
     
        //获取当前目录下的所有文件或目录
        File[] files = file.listFiles();

        //当file不是目录(是文件)或files是空目录时
        //if (files == null || files.length == 0)
        if (file.isFile() || files.length == 0) {
     
            file.delete();
            return;
        }


        //递归删除当前目录下的所有文件或目录
        for (int i = 0; i < files.length; i++) {
     
            deleteAll(files[i]);
        }

        //递归删除完file目录下的文件或目录后,file已经成为空目录,可以直接删除
        file.delete();
    }
}

你可能感兴趣的:(JavaSE)