【Java之轨迹】第六章:IO流 —— File 文件基本操作(删除文件夹、模糊查找)

—— 目录 ——


① 创建文件夹

public static void createFolder(String name)
{
    // 文件对象创建
    // File 对象可以是文件也可以是文件夹
    File folder = new File(name);

    // 判断文件夹是否存在,不存在返回false
    if(!folder.exists()) // 不存在则创建一个
    {
        // 使用 mkdir 只能创建一级目录,也就是说该目录的父级目录必须存在
        // 这里父级,目录不存在,所以创建失败了
        System.out.println(folder.mkdir());
        // 使用 mkdirs 即可创建多级目录,即使父级目录不存在也会被一个个创建出来
        System.out.println(folder.mkdirs());
    }
}
调用:createFolder("D:/test/test_2");
运行结果:false true

② 创建文件

// 创建文件
public static void createFile(String name) throws IOException
{
    File file = new File(name);
    if(!file.exists())
    {
        System.out.println(file.createNewFile());
    }
}
调用:createFile("D:/test/txt.txt");  这里直接抛给JVM了
运行结果:true

①② 的效果:
【Java之轨迹】第六章:IO流 —— File 文件基本操作(删除文件夹、模糊查找)

③ 判断文件性质

File folder = new File("D:/test");
File txt = new File("D:/test/txt.txt");

// 判断是否为文件或者文件夹
System.out.println("folder为:文件? " + folder.isFile() + " 文件夹? " + folder.isDirectory());
System.out.println("txt为:文件? " + txt.isFile() + " 文件夹? " + txt.isDirectory());

// 文件是否:存在、可读、可写
System.out.println("txt:存在?" + txt.exists() + " 可读?" + txt.canRead() + " 可写?" + txt.canWrite());
System.out.println("folder:存在?" + folder.exists() + " 可读?" + folder.canRead() + " 可写?" + folder.canWrite());

运行结果:
folder为:文件? false 文件夹? true
txt为:文件? true 文件夹? false
txt:存在?true 可读?true 可写?true
folder:存在?true 可读?true 可写?true

④ 获取文件属性

// 获取文件名
System.out.println(txt.getName());

// 获取文件路径
System.out.println(txt.getPath());
// 获取文件绝对路径
System.out.println(txt.getAbsolutePath());
// 获取上级路径
System.out.println(txt.getParent());

// 返回文件的大小,单位为字节
System.out.println(txt.length());
System.out.println(folder.length());

// 返回最后的修改时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(txt.lastModified()));
运行结果:
txt.txt
D:\test\txt.txt
D:\test\txt.txt
D:\test
0
0
2021-02-17 11:08:18

⑤ 获取文件夹列表

// 获取所有文件的文件名
String[] names = folder.list();
for(String name: names) System.out.println(name);
System.out.println("------");

// 获取所有文件对象
File[] nameFiles = folder.listFiles();
for(File name: nameFiles) System.out.println(name.getName());

⑥ 删除文件

System.out.println(txt.delete());
运行结果:true

⑦ 删除文件夹

这里又把删除的 txt.txt 恢复了,且在 test_2 文件夹中新增文件 txt_2.txt用于测试

删除文件夹比较麻烦,原因是当删除的文件夹中不是空文件夹时,会删除失败
而文件夹中又可能包含文件夹,这就要求必须一层一层深入将每个文件夹都清空,最后才能把目标文件夹删除
这就需要用到递归了

public static void main(String[] args) throws IOException
{
    deleteFolder(new File("D:/test"));
    File f = new File("D:/test");
    System.out.println(f.exists());
}

public static void deleteFolder(File folder)
{
    // 将文件夹全部清空
    // 如果是文件,则跳到下一步直接删除
    if(!folder.isFile())
    {
        // 是文件夹的话,把文件列表拿出来
        File[] files = folder.listFiles();

        // 保证文件对象取到了不为空,且文件夹也不为空
        if(files!=null && files.length >0)
            // 然后遍历删除
            for(File file: files) deleteFolder(file);  // 直接递归删除
    }

    // 最后一部把已清空的文件夹删除
    folder.delete();
}
运行结果:false
回去看可以发现 test 已经无了~

注意不要把D盘干掉了 O.O ,这个好像是粉碎性删除了,回收站找不到的

⑧ 查找文件(支持模糊查找)

public static void main(String[] args) throws IOException
{
    StringBuilder found  = seekFiles("D:/test", "test");
    System.out.println("找到如下:\n" + found);
}

// 查找文件 (在什么路径找什么名称)
public static StringBuilder seekFiles(String path, String name)
{
    StringBuilder found = new StringBuilder();  // 存放符合要求的路径

    File folder = new File(path);
    File[] files = folder.listFiles();

    // 如果文件夹对象不为空且文件夹不为空,则搜索
    if(files!=null && files.length>0)
        for(File file: files)
        {
            // 如果 文件/文件夹 名称包含指定名称,则添加到 found 中
            if(file.getName().contains(name))
                found.append(file.getAbsolutePath()).append("\n");

            // 如果还是文件夹,则继续递归查找
            if(file.isDirectory())
                found.append(findFiles(file.getAbsolutePath(), name));
        }

    return found;
}
运行结果:
找到如下:
D:\test\mytest
D:\test\ohhhhhhhhh\ohhhtest.txt
D:\test\test1
D:\test\ttt\ttttest
D:\test\ttt\ttttest\test.txt

原来是定期船从空中降落(寒冰小澈)

上一篇:软件


下一篇:删除子文件夹