38讲 File类

本文介绍了Java中的File类,用于表示文件和目录路径名。File类提供了多种构造方法来创建文件对象,包括基于路径名、父路径和子路径等。文章详细讲解了File对象的常用方法,如判断文件/目录存在、获取文件属性(大小、路径、名称、最后修改时间)以及创建、删除文件和目录。此外,还讨论了如何遍历文件夹内容和进行文件操作,如删除多级目录、计算文件夹大小以及统计文件数量。

1 File简述

File对象表示一个路径。

  • 该路径可以是文件的路径,也可以是文件夹的路径。

  • 该路径可以是已经存在的,也可以是不存在的。

导包: java.io.File

2 File构造方法

方法说明
public File(String pathName)根据文件路径创建文件对象
public File(String parent, String child)根据父路径和子路径创建文件对象
public File(File parent, String child)根据父路径对应文件对象和子路径创建文件对象

说明:

  • 父(级)路径,子(级)路径:如路径 C:\a\b\c.txt ,其中 C:\a\b 就是父级路径,c.txt 就是子级路径。

  • 构造File对象时,既可以传入绝对路径,也可以传入相对路径。绝对路径是以根目录开头的完整路径,例如:

    File f = new File("D:\\IDEA\\test.txt");
    

    注意Windows平台使用 \ 作为路径分隔符,在Java字符串中需要用 \\ 表示一个 \

import java.io.File;

public class FileDemo1 {
    public static void main(String[] args) {
        //根据文件路径创建文件对象
        String pathName = "D:\\IDEA\\test.txt";
        File file1 = new File(pathName);
        System.out.println(file1);	// D:\IDEA\test.txt

        //根据父路径和子路径创建文件对象
        String parent1 = "D:\\IDEA";
        String child1 = "test.txt";
        File file2 = new File(parent1, child1);
        System.out.println(file2);	// D:\IDEA\test.txt

        //根据父路径对应文件对象和子路径创建文件对象
        String parent2 = "D:\\IDEA";
        File parent2File = new File(parent2);
        String child2 = "test.txt";
        File file3 = new File(parent2File, child2);
        System.out.println(file3);	// D:\IDEA\test.txt
    }
}

3 File常用成员方法

3.1 判断

方法说明
boolean isDirectory()判断此路径名表示的File是否为文件夹
boolean isFile()判断此路径名表示的File是否为文件
boolean exists()判断此路径名表示的File是否存在

创建如下文件及文件夹

在这里插入图片描述

import java.io.File;

public class FileDemo2 {
    public static void main(String[] args) {
        File file1 = new File("D:\\test\\aaa.txt"); //文件
        File file2 = new File("D:\\test\\bbb");     //文件夹
        File file3 = new File("D:\\test\\ccc");     //不存在的路径名

        System.out.println(file1.isDirectory());//false
        System.out.println(file1.isFile());     //true
        System.out.println(file1.exists());     //true

        System.out.println(file2.isDirectory());//true
        System.out.println(file2.isFile());     //false
        System.out.println(file2.exists());     //true
        
        System.out.println(file3.isDirectory());//false
        System.out.println(file3.isFile());     //false
        System.out.println(file3.exists());     //false
    }
}

3.2 获取

方法说明
long length()返回文件的大小(不能直接获取文件夹)。单位:字节
String getAbsolutePath()返回文件的绝对路径
String getPath()返回定义文件时使用的路径
String getName()返回文件带后缀的名称,或者返回文件夹的名称。
long lastModified()返回文件最后修改的时间。单位:毫秒值
File getParentFile()返回文件以父级路径创建的文件对象

创建如下文件及文件夹

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileDemo3 {
    public static void main(String[] args) {
        File file1 = new File("D:\\test\\aaa.txt"); //D:\test里的文件
        File file2 = new File("D:\\test\\bbb");     //D:\test里的文件夹
        File file3 = new File("do24File\\aaa.txt"); //项目下的文件夹
        //返回文件的大小
        System.out.println(file1.length());     	//文件大小:3
        System.out.println(file2.length());     	//文件夹大小:0。该方法不能直接返回文件夹大小。

        //返回文件的绝对路径
        System.out.println(file1.getAbsoluteFile());    //D:\test\aaa.txt
        System.out.println(file3.getAbsoluteFile());    //D:\IDEA\StudyJAVA\do24File\aaa.txt

        //返回定义文件时使用的路径
        System.out.println(file1.getPath());    	//D:\test\aaa.txt
        System.out.println(file3.getPath());    	//do24File\aaa.txt

        //返回文件带后缀的名称,或者返回文件夹的名称。
        System.out.println(file1.getName());    	//aaa.txt
        System.out.println(file2.getName());    	//bbb

        //返回文件最后修改的时间。单位:毫秒值
        long time = file1.lastModified();
        System.out.println(time);       			//1672048639864
        Date date = new Date(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日, HH:mm:ss");
        String format = sdf.format(date);
        System.out.println(format);     			//2022年12月26日, 17:57:19
        
        //返回文件的父级路径
        File parentFile = file1.getParentFile();
        System.out.println(parentFile);    			 //D:\test
    }
}

3.3 创建、删除

方法说明
boolean createNewFile()创建一个新的空文件
boolean mkdir()创建单级文件夹
boolean mkdirs()创建单级或多级文件夹
boolean delete()删除文件空文件夹(直接删除不进回收站)

方法 createNewFile() 的3个注意点:

  1. 如果当前路径表示的文件是不存在的,则会在当前路径创建指定文件,返回true。如果已经存在,不创建文件,返回false。

验证:

先创建如下文件及文件夹:

在这里插入图片描述

执行如下代码:

public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\test\\ccc.txt");
        System.out.println(file1.createNewFile());
    }
}

第一次执行,输出 true ,并且在指定目录下创建了指定的文件

在这里插入图片描述

再次执行,输出 false

  1. 如果父级路径不存在,则会抛出异常 IOException
public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\test\\ccc\\ccc.txt");	//ccc文件夹是不存在的
        System.out.println(file1.createNewFile());
        //Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
    }
}
  1. createNewFile 创建的一定是文件。如果路径不包含后缀名,则创建一个没有后缀名的文件。
public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:\\test\\ccc");
        System.out.println(file1.createNewFile());	//true
    }
}

在这里插入图片描述

3.4 获取并遍历

方法说明
static File[] listRoots()获取系统中所有可用盘符
String[] list()获取当前路径下的全部内容
String[] list(FilenameFilter filter)利用文件名过滤器获取当前路径下的内容
File[] listFiles()获取当前路径下的全部内容
File[] listFiles(FileFilter filter)利用文件名过滤器获取当前路径下的内容
File[] listFiles(FilenameFilter filter)利用文件名过滤器获取当前路径下的内容

方法 listFiles() 注意:

  • 当调用者File表示的路径不存在时,返回null
  • 当调用者File表示的路径是文件时,返回null
  • 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
  • 当调用者File表示的路径是空文件夹时,返回一个长度为0的File类型数组
  • 当调用者File表示的路径是有内容的文件夹时,返回包含所有文件路径和文件夹路径的File类型数组(包含隐藏文件)

创建如下文件及文件夹:

在这里插入图片描述

public class FileDemo5 {
    public static void main(String[] args) {
        File file = new File("D:\\test");

        File[] files = file.listFiles();

        for (File file1 : files) {
            System.out.print(file1 + ", ");
            //D:\test\aaa, D:\test\aaa.txt, D:\test\bbb, D:\test\bbb.txt, 
        }
    }
}

4 常用操作

所有操作均可按以下步骤实现:

  1. 进入文件夹
  2. 遍历文件夹
  3. 判断是否为文件,并执行相关操作
  4. 判断是否为文件夹,并执行相关操作

4.1 删除多级目录

public class Demo {
    private static void deleteFiles(File file) {
        //1.进入文件夹
        File[] files = file.listFiles();
        //2.遍历文件夹
            for (File f : files) {
                if (f.isFile()) {
                    //3.如果是文件,直接删除
                    f.delete();
                } else {
                    //4.如果是文件夹,递归
                    deleteFiles(f);
                }
            }

        file.delete();
    }
}

4.2 计算文件夹大小

public class Demo {
    private static long getLength(File file) {
        long len = 0;
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                //如果是文件,直接获取大小并累加
                len += f.length();
            } else {
                //如果是文件夹,递归获取大小并累加
                len += getLength(f);
            }
        }

        return len;
    }
}

4.3 统计各种文件的数量

public class Demo {
        private static HashMap<String, Integer> getCount(File file) {
        HashMap<String, Integer> hm = new HashMap<>();
        File[] files = file.listFiles();
        for (File f : files) {
            //如果是文件,直接获取后缀名并统计
            if (f.isFile()) {
                String[] split = f.getName().split("\\.");
                if (split.length >= 2) {
                    String endName = split[split.length - 1];
                    if (hm.containsKey(endName)) {
                        int count = hm.get(endName);
                        count++;
                        hm.put(endName, count);
                    } else {
                        hm.put(endName, 1);
                    }
                }
            }
            //如果是文件夹,递归并统计数量并累加
            else {
                HashMap<String, Integer> sonMap = getCount(f);
                Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    String endName = entry.getKey();
                    int value = entry.getValue();

                    if (hm.containsKey(endName)) {
                        int count = hm.get(endName);
                        count += value;
                        hm.put(endName, count);
                    } else {
                        hm.put(endName, 1);
                    }
                }

            }
        }

        return hm;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值