File类

File类,它的就用来表示当前系统下的文件(也可以是文件夹)**,通过File类提供的方法可以获取文件大小、判断文件是否存在、创建文件、创建文件夹等。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:**File对象只能对文件进行操作,不能操作文件中的内容。

1.1 File对象的创建

File类和其他类一样,第一步是创建File类的对象。 想要创建对象,我们得看File类有哪些构造方法。
在这里插入图片描述

File类创建对象的代码

注意的是:路径中"\"要写成"\\", 路径中"/"可以直接用
    @Test
    public void fileStydy01() {
        // File.separator 适用于任何系统的路径间的拼接
        String path = "D:" + File.separator;
        // 取到对应的文件夹下面的文件信息 包含文件 文件夹 以及子目录信息
        File fileDirocte = new File(path);
        logger.info("文件长度:{}", fileDirocte.length());
        logger.info("文件是否存在:{}", fileDirocte.exists());
        // 可以取到对应的

        // File 对象的路径可以指向不存在的文件
        path = "G:" + File.separator;
        File fileDirocte2 = new File(path);
        logger.info("文件是否存在:{}", fileDirocte2.exists());
        if (fileDirocte2.exists())
            logger.info("文件长度:{}", fileDirocte2.length());

        // 相对路径获取文件信息时在当前工程种找

    }

1.2 File判断和获取方法

创建File对象的时候,会传递一个文件路径过来。但是File对象封装的路径是存在还是不存在,是文件还是文件夹其实是不清楚的。好在File类提供了方法可以帮我们做判断。
在这里插入图片描述

代码

@Test
    public void test02() {
        // 1.创建文件对象,指代某个文件
        File f1 = new File("D:/resource/ab.txt");
        //File f1 = new File("D:/resource/");

        // 2、public boolean exists():判断当前文件对象,对应的文件路径是否存在,存在返回true.
        logger.info("判断当前文件是否存在:{}", f1.exists());
        // 3、public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。
        logger.info("判断当前文件对象指代的是否是文件:{}", f1.length());

        // 4、public boolean isDirectory()  : 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。
        logger.info("判断当前文件是否为文件夹:{}", f1.isDirectory());
        // 5.public String getName():获取文件的名称(包含后缀)
        logger.info("获取文件的名称:{}", f1.getName());
        // 6.public long length():获取文件的大小,返回字节个数
        logger.info("获取文件的大小,返回字节个数: {}", f1.length());
        // 7.public long lastModified():获取文件的最后修改时间。
        long time = f1.lastModified();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        logger.info("获取文件的最后修改时间:{}", sdf.format(time));
        // 8.public String getPath():获取创建文件对象时,使用的路径
        File f2 = new File("D:\\resource\\ab.txt");
        File f3 = new File("file-io-app\\src\\itheima.txt");

        logger.info("获取创建文件对象时,使用的路径:{}", f2.getPath());
        logger.info("获取创建文件对象时,使用的路径:{}", f1.getPath());
        logger.info("获取创建文件对象时,使用的路径:{}", f3.getPath());

        // 9.public String getAbsolutePath():获取绝对路径
        logger.info("获取绝对路径:{}", f1.getAbsolutePath());
        logger.info("获取绝对路径:{}", f2.getAbsolutePath());
        logger.info("获取绝对路径:{}", f3.getAbsolutePath());
    }

1.3 创建和删除方法

File类提供了创建和删除文件的方法

    /**
     * 掌握File创建和删除文件相关的方法
     */
    @Test
    public void test03 () throws IOException {
        // 1、public boolean createNewFile():创建一个新文件(文件内容为空),创建成功返回true,反之。
        File f1 = new File("D:/resource/itheima2.txt");

        /**
         * java.io.IOException: 系统找不到指定的路径。 创建文件之前必须确保文件的路径是存在的否则出现IO异常
         */
        Boolean newFile = null;
        if (f1 != null && f1.exists()) {
            // 当前路径存在,创建文件
             newFile = f1.createNewFile();
        }else {
            // 当前文件不存在先创建文件路径
            File parentFile = f1.getParentFile();
            boolean mkdirs = parentFile.mkdirs();
            logger.info("创建文件路径:{} 不存在开始创建路径:{}", parentFile.getAbsolutePath(), mkdirs);
            // 当前路径存在,创建文件
            newFile = f1.createNewFile();
        }
        logger.info("创建文件是否成功:{}", newFile);

        // 2、public boolean mkdir():用于创建文件夹,注意:只能创建一级文件夹
        File f2 = new File("D:/resource/aaa");
        logger.info("创建文件是否成功:{} 文件路径:{}", f2.mkdir(),f2.getAbsolutePath());

        // 3、public boolean mkdirs():用于创建文件夹,注意:可以创建多级文件夹
        File f3 = new File("D:/resource/bbb/ccc/ddd/eee/fff/ggg");
        logger.info("创建文件是否成功:{} 文件路径:{}", f3.mkdirs(),f3.getAbsolutePath());


        // 3、public boolean delete():删除文件,或者空文件,注意:不能删除非空文件夹。
        logger.info("删除文件是否成功:{} 文件路径:{}", f1.delete(),f1.getAbsolutePath());
        logger.info("删除文件是否成功:{} 文件路径:{}", f2.delete(),f2.getAbsolutePath());
        logger.info("删除文件是否成功:{} 文件路径:{}", f3.delete(),f3.getAbsolutePath());

        File f4 = new File("D:/resource");
        logger.info("删除文件是否成功:{} 文件路径:{}", f4.delete(),f4.getAbsolutePath());

    }

需要注意的是:

1.mkdir(): 只能创建单级文件夹、
2.mkdirs(): 才能创建多级文件夹
3.delete(): 文件可以直接删除,但是文件夹只能删除空的文件夹,文件夹有内容删除不了。

1.4 遍历文件夹方法

在这里插入图片描述

/**
     * 目标:掌握File提供的遍历文件夹的方法。
     */
    @Test
    public void test05 () {
        // 1、public String[] list():获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。
            File f1 = new File("D:\\sofware");
            String[] names = f1.list();
            for (String name : names) {
                logger.info("获取的文件名:{}", name);
            }

            // 2、public File[] listFiles():(重点)获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)
            File[] files = f1.listFiles();
            for (File file : files) {
                logger.info("获取的File对象:{}", JSON.toJSON(file).toString());
            }

        logger.info("获取的File对象:{}", Arrays.toString(files));
    }

这里需要注意几个问题
1.当主调是文件时,或者路径不存在时,返回null
2.当主调是空文件夹时,返回一个长度为0的数组
3.当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹路径放在File数组中,并把数组返回
4.当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在FIle数组中,包含隐藏文件
5.当主调是一个文件夹,但是没有权限访问时,返回null

4.3 递归文件搜索

递归来遍历文件夹。

案例需求:在E:\\判断下搜索QQ.exe这个文件,然后直接输出。

1.先调用文件夹的listFiles方法,获取文件夹的一级内容,得到一个数组
2.然后再遍历数组,获取数组中的File对象
3.因为File对象可能是文件也可能是文件夹,所以接下来就需要判断
	判断File对象如果是文件,就获取文件名,如果文件名是`QQ.exe`则打印,否则不打印
	判断File对象如果是文件夹,就递归执行1,2,3步骤
所以:把12,3步骤写成方法,递归调用即可。
package com.study.common.until;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;

/**
 * @author chenxd8
 * @version V1.0
 * @Package com.study.common.until
 * @date 2023/10/16 15:23
 */
public class FileUntil {
    private static Logger logger = LoggerFactory.getLogger(FileUntil.class);

    /**
     * 去目录下搜索某个文件
     * @param dir      目录
     * @param fileName 要搜索的文件名称
     */
    public static String searchFile(File dir, String fileName) throws Exception {
        // 1、把非法的情况都拦截住
        if (dir == null || !dir.exists() || dir.isFile()) {
            logger.info("该文件路径不存在或其他原因,请检查文件信息:{}", dir);
            return dir + ""; // 代表无法搜索
        }

        String resultPath = null;

        // 2、dir不是null,存在,一定是目录对象。
        // 获取当前目录下的全部一级文件对象。
        File[] files = dir.listFiles();

        // 3、判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象。
        if (files != null && files.length > 0) {
            // 4、遍历全部一级文件对象。
            for (File f : files) {
                // 5、判断文件是否是文件,还是文件夹
                if (f.isFile()) {
                    // 是文件,判断这个文件名是否是我们要找的
                    if (f.getName().contains(fileName)) {
                        logger.info("找到该文件绝对路径为: {}", f.getAbsolutePath());
                        if (f.getName().endsWith(".exe")) {
                            // 运行该文件信息
                            Runtime runtime = Runtime.getRuntime();
                            runtime.exec(f.getAbsolutePath());
                        }

                    }
                } else {
                    // 是文件夹,继续重复这个过程(递归)
                    searchFile(f, fileName);
                }
            }
        }
        return resultPath;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值