Java File 类学习笔记

Java File 类学习笔记

1. 路径说明

  • 相对路径 :当前项目下,如 "a.txt"

  • 绝对路径 :完整路径,如 "D:\\a.txt"

2. File 类概述

File 对象表示一个路径,可以是文件路径,也可以是文件夹路径。这个路径可以是存在的,也可以是不存在的。

3. 构造方法

构造方法 说明
File(String pathName) 根据文件路径创建文件对象
File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象
File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象

3.1 构造方法示例

java 复制代码
// 1. File(String pathName)
String path = "D:\\aaa\\a.txt";
File file = new File(path);
System.out.println(file);
​
// 2. File(String parent, String child)
String parent = "D:\\aaa\\";
String child = "a.txt";
File file1 = new File(parent, child);
System.out.println(file1);
​
// 3. File(File parent, String child)
File parentFile = new File("D:\\aaa\\");
File file2 = new File(parentFile, "a.txt");
System.out.println(file2);

4. 常见成员方法

4.1 判断方法

方法 说明
boolean isDirectory() 判断此路径名表示的File是否为一个文件夹
boolean isFile() 判断此路径名表示的File是否为一个文件
boolean exists() 判断此路径名表示的File是否存在
java 复制代码
File file = new File("D:\\aaa\\a.txt");
System.out.println(file.isDirectory()); // false
System.out.println(file.isFile()); // true
System.out.println(file.exists()); // true

4.2 获取信息方法

方法 说明 注意事项
long length() 返回文件的大小(字节数量) 1. 如果获取的是文件夹,无法获取文件夹大小 2. 单位是字节,要获得M/G需要除以1024
String getAbsolutePath() 返回绝对路径
String getName() 返回文件名称,带后缀 调用者是文件→返回文件名和后缀名 调用者是文件夹→返回文件夹名
String getPath() 返回定义文件时使用的路径
long lastModified() 返回文件的最后修改时间(时间毫秒值)
java 复制代码
File file = new File("D:\\aaa\\a.txt");
System.out.println(file.length()); // 11
System.out.println(file.getAbsolutePath()); // D:\aaa\a.txt
System.out.println(file.getName()); // a.txt
System.out.println(file.getPath()); // D:\aaa\a.txt
​
// 格式化最后修改时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(file.lastModified());
System.out.println(format); // 2025-09-03 19:05:17

4.3 创建和删除方法

方法 说明 注意事项
boolean createNewFile() 创建一个新的空的文件 1. 如果父级路径不存在,方法会有异常 IOException 2. 创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件
boolean mkdir() 创建单级文件夹 1. Windows中路径唯一,创建文件路径不能重复 2. 只能创建单级文件夹,无法创建多级
boolean mkdirs() 创建多级文件夹 如果已经存在,返回false
boolean delete() 删除文件,空文件夹 1. 如果删除的是文件夹,文件夹必须为空才能删除成功 2. 删除不走回收站
java 复制代码
// 创建文件
File file4 = new File("D:\\aaa\\b.txt");
boolean newFile = file4.createNewFile();
System.out.println(newFile); // true (如果文件已经存在,返回false)
​
// 创建单级文件夹
File file5 = new File("D:\\aaa\\bbb");
boolean mkdir = file5.mkdir();
System.out.println(mkdir); // true
​
// 创建多级文件夹
File file6 = new File("D:\\aaa\\bbb\\ccc");
boolean mkdirs = file6.mkdirs();
System.out.println(mkdirs); // true (如果已经存在,返回false)
​
// 删除文件或空文件夹
File file7 = new File("D:\\aaa\\bbb\\ccc\\a.txt");
boolean delete = file7.delete();
System.out.println(delete);

4.4 遍历目录方法

方法 说明 注意事项
File[] listFiles() 获取当前路径下所有内容 1. 路径不存在→返回null 2. 路径是文件→返回null 3. 空文件夹→返回长度为0的数组 4. 非空文件夹→返回包含所有内容的File数组 5. 需要权限的文件夹→返回null
static File[] listRoots() 获取当前操作系统的根路径
String[] list() 获取当前路径下的所有内容(仅获取名字)
String[] list(FilenameFilter filter) 利用文件名过滤器获取当前路径下的所有内容
File[] listFiles(FileFilter filter) 利用文件过滤器获取当前路径下的所有内容
File[] listFiles(FilenameFilter filter) 利用文件名过滤器获取当前路径下的所有内容
java 复制代码
// 获取当前路径下所有内容
File file8 = new File("D:\\aaa");
File[] files = file8.listFiles();
for (File file9 : files) {
    System.out.println(file9);
}
​
// 获取当前操作系统的根路径
File[] roots = File.listRoots();
for (File root : roots) {
    System.out.println(root);
}
​
// 获取当前路径下的所有内容(仅名字)
String[] list = file8.list();
for (String s : list) {
    System.out.println(s);
}
​
// 使用文件名过滤器
String[] list1 = file8.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        File src = new File(dir, name);
        return src.isFile() && name.endsWith(".txt");
    }
});
System.out.println(Arrays.toString(list1));
​
// 使用Lambda表达式简化
String[] list2 = file8.list((dir, name) -> {
    File src = new File(dir, name);
    return src.getName().endsWith(".txt") && src.isFile();
});
System.out.println(Arrays.toString(list2));
​
// 使用文件过滤器
File[] files2 = file8.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return pathname.isFile() && pathname.getName().endsWith(".txt");
    }
});
​
// 使用Lambda表达式简化
File[] files4 = file8.listFiles(file10 -> 
    file10.isFile() && file10.getName().endsWith(".txt"));

5. 练习示例

5.1 练习1:创建文件

java 复制代码
// 在D盘的aaa文件夹下创建一个文件a.txt
File file11 = new File("D:\\aaa\\a.txt");
boolean newFile2 = file11.createNewFile();
System.out.println(newFile2);

5.2 练习2:查找特定文件

java 复制代码
// 定义一个方法,找某一个文件夹中,是否有以avi结尾的电影
public static boolean findAvi(File src) {
    File[] files = src.listFiles();
    for (File file : files) {
        if (file.isFile() && file.getName().endsWith(".avi")) {
            return true;
        }
    }
    return false;
}

5.3 练习3:递归查找所有特定文件

java 复制代码
// 找到电脑中所有以avi结尾的电影并输出绝对路径
public static void findAvi1() {
    File[] files = File.listRoots();
    for (File file : files) {
        findAvi1(file);
    }
}
​
public static void findAvi1(File src) {
    File[] files = src.listFiles();
    if (files != null) {
        for (File file : files) {
            if (file.isFile()) {
                String name = file.getName();
                if (name.endsWith(".avi")) {
                    System.out.println(file.getAbsolutePath());
                }
            } else {
                findAvi1(file);
            }
        }
    }
}

5.4 练习4:删除多级文件夹

java 复制代码
// 删除一个多级文件夹
// 1.先删除文件夹里的所有内容
// 2.再删除自己
public static void deleteDir(File src) {
    File[] files = src.listFiles();
    // 1.先删除文件夹里的所有内容
    if (files != null) {
        for (File file : files) {
            if (file.isFile()) {
                file.delete();
            } else {
                deleteDir(file);
            }
        }
    }
    // 2.再删除自己
    src.delete();
}

5.5 练习5:统计文件夹大小

java 复制代码
// 统计一个文件夹大小
public static long getDirSize(File src) {
    File[] files = src.listFiles();
    long size = 0;
    for (File file : files) {
        if (file.isFile()) {
            size += file.length();
        } else {
            size += getDirSize(file);
        }
    }
    return size;
}

5.6 练习6:统计文件类型个数

java 复制代码
// 统计一个文件夹下,每个文件类型的个数
// 参数:要统计的那个文件夹
// 返回值:一个Map集合,集合的键:文件后缀名,值:文件类型的个数
public static Map<String, Integer> getCount(File src) {
    Map<String, Integer> map = new HashMap<>();
    File[] files = src.listFiles();
    for (File file : files) {
        if (file.isFile()) {
            // 如果是文件,统计
            String name = file.getName();
            String[] split = name.split("\\.");
            if (split.length >= 2) {
                String endName = split[split.length - 1];
                if (map.containsKey(endName)) {
                    // 存在
                    int count = map.get(endName);
                    count++;
                    map.put(endName, count);
                } else {
                    // 不存在
                    map.put(endName, 1);
                }
            }
        } else {
            // 如果是文件夹,递归
            // 子文件夹中统计的结果
            Map<String, Integer> sonMap = getCount(file);
            // 遍历累加
            for (Map.Entry<String, Integer> entry : sonMap.entrySet()) {
                String key = entry.getKey();
                Integer value = entry.getValue();
                if (map.containsKey(key)) {
                    // 存在
                    int count = map.get(key);
                    count += value;
                    map.put(key, count);
                } else {
                    // 不存在
                    map.put(key, value);
                }
            }
        }
    }
    return map;
}

6. 注意事项

  1. Windows 中使用 \ 作为路径分隔符,Linux 中使用 /

  2. 在字符串中,\ 是转义字符,需要使用 \\ 表示 \

  3. 创建文件时,如果父级路径不存在,会抛出 IOException

  4. 删除文件夹时,文件夹必须为空才能删除成功

  5. 遍历目录时,需要注意权限问题和空值判断

通过合理使用 File 类,可以方便地进行文件和目录的操作,包括创建、删除、遍历和统计等操作。

相关推荐
lingggggaaaa3 小时前
小迪安全v2023学习笔记(七十九讲)—— 中间件安全&IIS&Apache&Tomcat&Nginx&CVE
笔记·学习·安全·web安全·网络安全·中间件·apache
拾忆,想起3 小时前
Redis复制延迟全解析:从毫秒到秒级的优化实战指南
java·开发语言·数据库·redis·后端·缓存·性能优化
掘根3 小时前
【CMake】缓存变量
java·后端·spring
西京刀客3 小时前
macos安装openjdk17
java·macos·java17
Java中文社群4 小时前
面试官:如何实现动态线程池的任务编排?
java·后端·面试
mysla4 小时前
嵌入式学习day44-硬件—ARM体系架构
学习
lozhyf4 小时前
能发弹幕的简单视频网站
java·spring boot·后端
微露清风4 小时前
系统性学习数据结构-第三讲-栈和队列
java·数据结构·学习
AAA修煤气灶刘哥5 小时前
ES 地理查询玩明白,产品要的 “附近的店” 再也难不倒我!(附 DSL+Java 实战)
java·后端·elasticsearch