Java File类

2. File类

2.1 概述

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

2.2 构造方法

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

  • public File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。

  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

  • 构造举例,代码如下:
java 复制代码
// 文件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname); 
​
// 文件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2); 
​
// 通过父路径和子路径字符串
 String parent = "d:\\aaa";
 String child = "bbb.txt";
 File file3 = new File(parent, child);
​
// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

甚至可以自己拼接:File f3 = new File(parent + "\\" + child);

\:转义字符 这个是有特殊含义的 所以如果你想把它变成路径分割符的话得写 \\ [正则表达式也用得到

但是我们不会自己去拼接 而是用Java的拼接 因为这个程序不一定是运行在window系统中的

在windows当中路径分隔符为: \

在Linux路径分隔符为: /

如果自己拼接那代码就是"死"的,但是java中的会获取你的操作系统,根据操作系统会用不同的路径分隔符
小贴士:

  1. 一个File对象代表硬盘中实际存在的一个文件或者目录。

  2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

2.3 常用方法

获取功能的方法

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。

  • public String getPath() :将此File转换为路径名字符串。

  • public String getName() :返回由此File表示的文件或目录的名称。

  • public long length() :返回由此File表示的文件的长度。

  • 方法演示,代码如下:

为了方便演示我现在自己的D盘下创建了一个yjy的目录,目录里面放了两个文件夹和两个文本文件

java 复制代码
//1.对一个文件的路径进行判断
        File f1 = new File("D:\\yjy\\111.txt");
        System.out.println(f1.isDirectory());//false
        System.out.println(f1.isFile());//true
        System.out.println(f1.exists());//true
        System.out.println("-------------------");
        //2.对一个文件夹的路径进行判断
        File f2 = new File("D:\\yjy\\n1");
        System.out.println(f2.isDirectory());//true
        System.out.println(f2.isFile());//false
        System.out.println(f2.exists());//true
        //3.对一个不存在的路径进行判断
        File f3 = new File("D:\\yjy\\333.txt");
        System.out.println(f3.isDirectory());//false
        System.out.println(f3.isFile());//true
        System.out.println(f3.exists());//false
java 复制代码
 /**
         * 1.length 返回文件的大小 (字节数量)
         * <h2>细节一:</h2>
         * 这个方法只能获得文件的大小,单位是字节
         * 如果单位我们希望是KB,MB,G 可以不断地除以1024
         * <h2>细节二:</h2>
         * 如果我们要获得一个文件夹的带下,需要把这个文件夹里面所有的文件大小都累加在一起
         * (后面有练习演示)
         */
        File f1 = new File("D:\\yjy\\111.txt");
        long length1 = f1.length();
        System.out.println(length1);// 如果文件什么都没有写 那就是0

        File f2 = new File("D:\\yjy\\n1");
        long length2 = f2.length();
        System.out.println(length2);//可能是0也可能是其他数字
java 复制代码
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;

import java.util.*;

public class Main {

    public static void main(String[] args) {
        //3.getPath 返回定义文件时使用的路径
        //(1)绝对路径
        File f5 = new File("D:\\yjy\\111.txt");
        String path = f5.getPath();
        System.out.println(path);//  D:\yjy\111.txt
        //(2)相对路径
        File f6 = new File("yjy\\222.txt");
        String path1 = f6.getPath();
        System.out.println(path1);// yjy\222.txt

        //getName 获取名字
        //细节一:
        //文件:假如是111.txt
        //          111 文件名
        //          txt 后缀名,扩展名
        //细节二:
        //文件夹:返回的就是文件夹的名字
        File f7 = new File("D:\\yjy\\222.txt");
        String name = f7.getName();
        System.out.println(name); //    222.txt

        File f8 = new File("D:\\yjy\\n2");
        String name1 = f8.getName();
        System.out.println(name1); //  n2

        //lastModified  返回文件的最后修改时间(时间毫秒值)
        File f9 = new File("D:\\yjy\\111.txt");
        long l = f9.lastModified();
        System.out.println(l);// 1702649692839

        //如何把时间的毫秒值变成字符串表示的时间呢?
        //yyyy年MM月dd日 HH: mm: ss




        // 获取文件的最后修改时间的毫秒值
        File file = new File("D:\\yjy\\111.txt");
        long milliseconds = file.lastModified();
        System.out.println("文件最后修改时间的毫秒值:" + milliseconds);

        // 创建SimpleDateFormat对象,定义时间格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

        // 将毫秒值转换为Date对象
        Date resultDate = new Date(milliseconds);

        // 使用SimpleDateFormat格式化Date对象为字符串
        String dateString = sdf.format(resultDate);

        // 输出结果
        System.out.println("文件最后修改时间的字符串表示:" + dateString);//2023年12月15日 22:14:52

    }
}

API中说明:length(),表示文件的长度。但是File对象表示目录,则返回值未指定。

绝对路径和相对路径

  • 绝对路径:从盘符开始的路径,这是一个完整的路径。

  • 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。

java 复制代码
public class FilePath {
    public static void main(String[] args) {
        // D盘下的bbb.java文件
        File f = new File("D:\\bbb.java");
        System.out.println(f.getAbsolutePath());
        
        // 项目下的bbb.java文件
        File f2 = new File("bbb.java");
        System.out.println(f2.getAbsolutePath());
    }
}
输出结果:
D:\bbb.java
D:\idea_project_test4\bbb.java

在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算

In mathematics and computer science, an algorithm (/ˈælɡərɪðəm/) is a finite sequence of rigorous instructions, typically used to solve a class of specific problems or to perform a computation.1

判断功能的方法

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

  • public boolean isDirectory() :此File表示的是否为目录。

  • public boolean isFile() :此File表示的是否为文件。

方法演示,代码如下:

java 复制代码
public class FileIs {
    public static void main(String[] args) {
        File f = new File("d:\\aaa\\bbb.java");
        File f2 = new File("d:\\aaa");
        // 判断是否存在
        System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
        System.out.println("d:\\aaa 是否存在:"+f2.exists());
        // 判断是文件还是目录
        System.out.println("d:\\aaa 文件?:"+f2.isFile());
        System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
    }
}
输出结果:
d:\aaa\bbb.java 是否存在:true
d:\aaa 是否存在:true
d:\aaa 文件?:false
d:\aaa 目录?:true

创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 创建一个新的空的文件

  • public boolean delete() :删除由此File表示的文件或目录。删除文件,空文件夹

  • public boolean mkdir() :创建由此File表示的目录。创建单级文件

  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。创建多级文件

注:delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站.

方法演示,代码如下:

java 复制代码
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        //1.createNewFile 创建一个新的空的文件
        //细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true
        //      如果当前路径表示的文件是存在的,那么创建失败,方法返回false
        //细节2:如果父级路径是不存在的,那么方法会有异常IOException
        //细节3:creatNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件
        File file = new File("D:\\yjy\\yyy");
        boolean b = file.createNewFile();
        System.out.println(b);

        //2.mkdir  make Directory, 文件夹(目录)
        //细节1:windows 当中路径是唯一的,如果当前路径是已经存在,则创建失败,返回false
        //细节2:mkdir只能创建单级文件夹,无法创建多级文件夹
        File file1 = new File("D:\\yjy\\n1\\n3\\n4");
        boolean b1 = file1.mkdir();
        System.out.println(b1);

        //3.mkdirs创建多级文件夹
        //细节:既可以创建单级,又可以创建多级的文件夹
        File f3 = new File("D:\\n2\\rrr");
        boolean mkdirs = f3.mkdirs();
        System.out.println(b);

        //delete
        //细节:如果删除的是文件,则直接删除,不走回收站
        //如果删除的是空文件夹,则直接删除,不走回收站
        //如果删除的是右内容的文件夹,则删除失败

        File f1 = new File("D\\yjy\\n1");
        boolean b2 = f1.delete();
        System.out.println(b1);


    }
}
java 复制代码
public class FileCreateDelete {
    public static void main(String[] args) throws IOException {
        // 文件的创建
        File f = new File("aaa.txt");
        System.out.println("是否存在:"+f.exists()); // false
        System.out.println("是否创建:"+f.createNewFile()); // true
        System.out.println("是否存在:"+f.exists()); // true
        
        // 目录的创建
        File f2= new File("newDir");    
        System.out.println("是否存在:"+f2.exists());// false
        System.out.println("是否创建:"+f2.mkdir()); // true
        System.out.println("是否存在:"+f2.exists());// true
​
        // 创建多级目录
        File f3= new File("newDira\\newDirb");
        System.out.println(f3.mkdir());// false
        File f4= new File("newDira\\newDirb");
        System.out.println(f4.mkdirs());// true
      
        // 文件的删除
        System.out.println(f.delete());// true
      
        // 目录的删除
        System.out.println(f2.delete());// true
        System.out.println(f4.delete());// false
    }
}

API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。

2.4 目录的遍历

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。

  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

java 复制代码
public class FileFor {
    public static void main(String[] args) {
        File dir = new File("d:\\java_code");
      
        //获取当前目录下的文件以及文件夹的名称。
        String[] names = dir.list();
        for(String name : names){
            System.out.println(name);
        }
        //获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }
}

小贴士:

调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

2.5 综合练习

练习1:创建文件夹

在当前模块下的aaa文件夹中创建一个a.txt文件

代码实现:

java 复制代码
public class Test1 {
    public static void main(String[] args) throws IOException {
        //需求:在当前模块下的aaa文件夹中创建一个a.txt文件
​
        //1.创建a.txt的父级路径
        File file = new File("myfile\\aaa");
        //2.创建父级路径
        //如果aaa是存在的,那么此时创建失败的。
        //如果aaa是不存在的,那么此时创建成功的。
        file.mkdirs();
        //3.拼接父级路径和子级路径
        File src = new File(file,"a.txt");
        boolean b = src.createNewFile();
        if(b){
            System.out.println("创建成功");
        }else{
            System.out.println("创建失败");
        }
    }
}
练习2:查找文件(不考虑子文件夹)

定义一个方法找某一个文件夹中,是否有以avi结尾的电影(暂时不需要考虑子文件夹)

代码示例:

java 复制代码
public class Test2 {
    public static void main(String[] args) {
        /*需求:
             定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
            (暂时不需要考虑子文件夹)
        */
​
        File file = new File("D:\\aaa\\bbb");
        boolean b = haveAVI(file);
        System.out.println(b);
    }
    /*
    * 作用:用来找某一个文件夹中,是否有以avi结尾的电影
    * 形参:要查找的文件夹
    * 返回值:查找的结果  存在true  不存在false
    * */
    public static boolean haveAVI(File file){// D:\\aaa
        //1.进入aaa文件夹,而且要获取里面所有的内容
        File[] files = file.listFiles();
        //2.遍历数组获取里面的每一个元素
        for (File f : files) {
            //f:依次表示aaa文件夹里面每一个文件或者文件夹的路径
            if(f.isFile() && f.getName().endsWith(".avi")){
                return true;
            }
        }
        //3.如果循环结束之后还没有找到,直接返回false
        return false;
    }
}

练习3:(考虑子文件夹)

找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)

代码示例:

java 复制代码
public class Test3 {
    public static void main(String[] args) {
        /* 需求:
        找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
​
​
        套路:
            1,进入文件夹
            2,遍历数组
            3,判断
            4,判断
​
        */
​
        findAVI();
​
    }
​
    public static void findAVI(){
        //获取本地所有的盘符
        File[] arr = File.listRoots();
        for (File f : arr) {
            findAVI(f);
        }
    }
​
    public static void findAVI(File src){//"C:\\
        //1.进入文件夹src
        File[] files = src.listFiles();
        //2.遍历数组,依次得到src里面每一个文件或者文件夹
        if(files != null){
            for (File file : files) {
                if(file.isFile()){
                    //3,判断,如果是文件,就可以执行题目的业务逻辑
                    String name = file.getName();
                    if(name.endsWith(".avi")){
                        System.out.println(file);
                    }
                }else{
                    //4,判断,如果是文件夹,就可以递归
                    //细节:再次调用本方法的时候,参数一定要是src的次一级路径
                    findAVI(file);
                }
            }
        }
    }
}

练习4:删除多级文件夹

需求: 如果我们要删除一个有内容的文件夹 1.先删除文件夹里面所有的内容 2.再删除自己

代码示例:

java 复制代码
public class Test4 {
    public static void main(String[] args) {
        /*
           删除一个多级文件夹
           如果我们要删除一个有内容的文件夹
           1.先删除文件夹里面所有的内容
           2.再删除自己
        */
​
        File file = new File("D:\\aaa\\src");
        delete(file);
​
    }
​
    /*
    * 作用:删除src文件夹
    * 参数:要删除的文件夹
    * */
    public static void delete(File src){
        //1.先删除文件夹里面所有的内容
        //进入src
        File[] files = src.listFiles();
        //遍历
        for (File file : files) {
            //判断,如果是文件,删除
            if(file.isFile()){
                file.delete();
            }else {
                //判断,如果是文件夹,就递归
                delete(file);
            }
        }
        //2.再删除自己
        src.delete();
    }
}

练习5:统计大小

需求:统计一个文件夹的总大小

代码示例:

java 复制代码
public class Test5 {
    public static void main(String[] args) {
       /*需求:
            统计一个文件夹的总大小
      */
​
​
        File file = new File("D:\\aaa\\src");
​
        long len = getLen(file);
        System.out.println(len);//4919189
    }
​
    /*
    * 作用:
    *       统计一个文件夹的总大小
    * 参数:
    *       表示要统计的那个文件夹
    * 返回值:
    *       统计之后的结果
    *
    * 文件夹的总大小:
    *       说白了,文件夹里面所有文件的大小
    * */
    public static long getLen(File src){
        //1.定义变量进行累加
        long len = 0;
        //2.进入src文件夹
        File[] files = src.listFiles();
        //3.遍历数组
        for (File file : files) {
            //4.判断
            if(file.isFile()){
                //我们就把当前文件的大小累加到len当中
                len = len + file.length();
            }else{
                //判断,如果是文件夹就递归
                len = len + getLen(file);
            }
        }
        return len;
    }
}

练习6:统计文件个数

需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹) 打印格式如下: txt:3个 doc:4个 jpg:6个

代码示例:

java 复制代码
public class Test6 {
    public static void main(String[] args) throws IOException {
        /*
            需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
            打印格式如下:
            txt:3个
            doc:4个
            jpg:6个
        */
        File file = new File("D:\\aaa\\src");
        HashMap<String, Integer> hm = getCount(file);
        System.out.println(hm);
    }
​
    /*
    * 作用:
    *       统计一个文件夹中每种文件的个数
    * 参数:
    *       要统计的那个文件夹
    * 返回值:
    *       用来统计map集合
    *       键:后缀名 值:次数
    *
    *       a.txt
    *       a.a.txt
    *       aaa(不需要统计的)
    *
    *
    * */
    public static HashMap<String,Integer> getCount(File src){
        //1.定义集合用来统计
        HashMap<String,Integer> hm = new HashMap<>();
        //2.进入src文件夹
        File[] files = src.listFiles();
        //3.遍历数组
        for (File file : files) {
            //4.判断,如果是文件,统计
            if(file.isFile()){
                //a.txt
                String name = file.getName();
                String[] arr = name.split("\\.");
                if(arr.length >= 2){
                    String endName = arr[arr.length - 1];
                    if(hm.containsKey(endName)){
                        //存在
                        int count = hm.get(endName);
                        count++;
                        hm.put(endName,count);
                    }else{
                        //不存在
                        hm.put(endName,1);
                    }
                }
            }else{
                //5.判断,如果是文件夹,递归
                //sonMap里面是子文件中每一种文件的个数
                HashMap<String, Integer> sonMap = getCount(file);
                //hm:  txt=1  jpg=2  doc=3
                //sonMap: txt=3 jpg=1
                //遍历sonMap把里面的值累加到hm当中
                Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    String key = entry.getKey();
                    int value = entry.getValue();
                    if(hm.containsKey(key)){
                        //存在
                        int count = hm.get(key);
                        count = count + value;
                        hm.put(key,count);
                    }else{
                        //不存在
                        hm.put(key,value);
                    }
                }
            }
        }
        return hm;
    }
}
相关推荐
Scott9999HH1 天前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔1 天前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社1 天前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海1 天前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖1 天前
JDK 26 新特性详解
java·开发语言
马优晨1 天前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区1 天前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大1 天前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai1 天前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说1 天前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json