由浅到深认识Java语言(35):File类

该文章Github地址:https://github.com/AntonyCheng/java-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】& CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(34):多线程

43.File类(操作文件夹,文件和路径)

  • 文件夹 Directory:存储文件的容器,防止文件重名而设置,可以对文件归类,但是文件夹本身不存储任何数据,计算机专业术语中被称为目录;
  • 文件 File:存储数据的容器,同一个目录中的文件名不能相同;
  • 路径 Path:一个目录或者文件在磁盘中的位置;
    • c:\jdk8\jar 是目录的路径,是一个文件夹的路径;
    • c:\jdk8\bin\javac.exe 是一个文件的路径;
    • Windows 系统不区分目录和文件大小写,但是 Linux 系统要区分目录和文件大小写;
  • File 类:是为了描述目录和文件的路径的对象,但是不能修改文件中的数据;
  • 具有平台无关性,即跨平台性;

File类的构造方法

  • File(String pathname) 传递字符串的路径名;
  • File(String parent,String child) 床底字符串的父路径,字符串的子路径;
  • File(File parent,String child) 传递 File 类的父路径,字符串的子路径;

示例如下:

package top.sharehome.Demo;

import java.io.File;
import java.util.concurrent.*;

public class Demo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        File file = new File("C:\\Program Files\\Common Files\\Oracle\\Java");
        System.out.println("file = " + file);
        File file1 = new File("C:\\Program Files\\Common Files\\Oracle","Java");
        System.out.println("file1 = " + file1);
        File file2 = new File(file,"javapath");
        System.out.println("file2 = " + file2);
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意:File 类的构造器可以直接被打印,但是并不会判断系统中是否存在此目录或者文件,需要调用类下的 exists() 方法来判断;

File类的判断方法

  • boolean exists() 判断构造方法中的路径是否存在;
  • boolean isDirectory() 判断构造方法中的路径是不是文件夹;
  • boolean isFile() 判断构造方法中的路径是不是文件;
  • boolean isAbsolute() 判断构造方法中的是不是绝对路径;

示例如下:

package top.sharehome.Demo;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.*;

public class Demo {
    public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
        File file = new File("d:\\大学课程学习文档\\java\\Practice\\IO");
        System.out.println("file.exists() = " + file.exists());
        System.out.println("file.isDirectory() = " + file.isDirectory());
        System.out.println("file.isFile() = " + file.isFile());
        System.out.println("file.isAbsolute() = " + file.isAbsolute());
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绝对/相对路径

  • 绝对路径
    • 在磁盘中的路径具有唯一性;
    • Windows 系统中,以盘符开头:C:/java/jar
    • Linux 或者 Unix 系统中,以 / 开头:/user/local
    • 互联网路径:https://www.baidu.com
  • 相对路径
    • 必须有参照物,假如是 bin
    • 参照物的父类就是 ../

File类的创建方法

File 类的创建方法禁止创建重名元素,这个重名可以是文件和文件之间的重名,可以是文件夹和文件夹之间的重名,甚至是文件和文件夹的重名

  • file.createNewFile() 方法,返回一个 boolean 判断文件是否创建成功,但是创建的文件名需要事先存在于 file 对象的构造器中,这里需要区分 文件文件夹 的区别,该方法创建的是文件,而不是文件夹,所以即使没有后缀名,它也可以创建无后缀名的文件;

    示例如下:

    package top.sharehome.Demo;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.*;
    
    public class Demo {
        public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
            File file = new File("d:\\大学课程学习文档\\java\\Practice\\IO\\FileTest.txt");
            System.out.println("file.exists() = " + file.exists());
            boolean newFile = file.createNewFile();
            if (newFile){
                System.out.println("创建成功!");
            }else {
                System.out.println("创建失败!");
            }
        }
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • file.mkdirs() 方法,返回一个 boolean 判断文件夹是否创建成功,但是创建的文件夹名需要事先存在于 file 对象的构造器中,文件夹名也可以带后缀名,只不过建出来的依旧是一个文件夹,由于 Windows 系统识别目录名字符长度不得超过 255 ,如果创建文件夹层数过多或者名字过长,Windows 会不识别,那么创建后的文件夹可能永远也删不掉了

    示例如下:

    package top.sharehome.Demo;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.*;
    
    public class Demo {
        public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
            File file = new File("d:\\大学课程学习文档\\java\\Practice\\IO\\FileTest");
            System.out.println("file.exists() = " + file.exists());
            boolean newFile = file.mkdirs();
            if (newFile){
                System.out.println("创建成功!");
            }else {
                System.out.println("创建失败!");
            }
        }
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    还有一个方法叫做 file.mkdir() 该方法只能建立一层文件夹,所以处于被 file.mkdirs() 方法取代的状态;

File类的删除方法

file.delete() 方法删除指定的目录或者文件,返回一个 boolean 判断是否删除成功,该路径要事先写在 file 对象中;

示例如下:

package top.sharehome.Demo;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.*;

public class Demo {
    public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
        File file = new File("d:\\大学课程学习文档\\java\\Practice\\IO\\FileTest");
        if (file.exists()) {
            System.out.println("存在该文件或者目录!");
            if (file.delete()) {
                System.out.println("删除成功!");
            }else {
                System.out.println("删除失败!");
            }
        }else {
            System.out.println("没有该文件或者目录");
        }
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

若要删除文件夹,必须保证该文件夹为空,不然删除就会失败!

File类的获取方法

File getAbsoluteFile() 获取绝对路径,返回值是一个 File 类型;

Java 默认的相对路径参考点是本项目所在路径,即下例中,我们在项目中建立一个 IO 文件夹,然后传入 IO:

package top.sharehome.Demo;

import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        File f = new File("IO");
        System.out.println("f.getAbsoluteFile() = " + f.getAbsoluteFile());
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

File getParentFile() 获取父路径,返回值式 File 类型;

因为返回的是 File 对象,所以我们可以多次使用 File 的方法:

package top.sharehome.Demo;

import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        File f = new File("d:\\大学课程学习文档\\java\\Practice\\IO");
        System.out.println("f.getParentFile().getParentFile().getParentFile().getParentFile() = " + f.getParentFile().getParentFile().getParentFile().getParentFile());
        System.out.println("f.getParentFile().getParentFile().getParentFile() = " + f.getParentFile().getParentFile().getParentFile());
        System.out.println("f.getParentFile().getParentFile() = " + f.getParentFile().getParentFile());
        System.out.println("f.getParentFile() = " + f.getParentFile());
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

String getName() 获取名字,File 构造方法中的路径名字;

package top.sharehome.Demo;

import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        File f = new File("d:\\大学课程学习文档\\java\\Practice\\IO");
        System.out.println("f.getName() = " + f.getName());
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

String getPath() 获取 File 构造方法中的路径,完整的路径转成 String 返回;

package top.sharehome.Demo;

import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        File f = new File("d:\\大学课程学习文档\\java\\Practice\\IO");
        System.out.println("f.getPath() = " + f.getPath());
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

long length() 获取文件的字节数;

package top.sharehome.Demo;

import java.io.File;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        File f = new File("d:\\大学课程学习文档\\java\\Practice\\IO");
        System.out.println("f.length() = " + f.length());
        System.out.println("f.getParentFile().length() = " + f.getParentFile().length());
    }
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

File类的遍历方法

  • listFile() 方法 返回值是 File[] 数组,存储了多个 File 对象,方法的作用是遍历当前的文件夹;

    package top.sharehome.Demo;
    
    import java.io.File;
    import java.io.IOException;
    
    public class Demo {
        public static void main(String[] args) throws IOException {
            File f = new File("d:\\大学课程学习文档\\java\\Practice\\IO");
            File[] files = f.listFiles();
            for (int i = 0; i < files.length; i++) {
                System.out.println(files[i]);
            }
        }
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 递归遍历一个文件夹中所有的元素:

    思路:遇到文件夹先输出再进入递归方法,遇到文件就直接输出;

    package top.sharehome.Demo;
    
    import java.io.File;
    import java.io.IOException;
    
    public class Demo {
        public static void main(String[] args) throws IOException {
            File f = new File("d:\\大学课程学习文档\\java\\Practice");
            method(f);
        }
    
        public static void method(File dir) {
            File[] files = dir.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    System.out.println(files[i]);
                    method(files[i]);
                } else {
                    System.out.println(files[i]);
                }
            }
        }
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    既然可以遍历一个文件夹中所有的元素,那么我们可以用这个特性来设计一些实用的程序,比如删除一个文件夹内所有空文件夹;

    **思路:**先遍历到最底层的文件夹,再判断这个文件夹的长度,若为零则删除;

    IO文件夹如下

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    package top.sharehome.Demo;
    
    import java.io.File;
    import java.io.IOException;
    
    public class Demo {
        static long count;
        public static void main(String[] args) throws IOException {
            File f = new File("d:\\大学课程学习文档\\java\\Practice\\IO");
            method(f);
            System.out.println("一共删减了"+count+"个空文件夹!");
        }
    
        public static void method(File dir) {
            File[] files = dir.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    method(files[i]);
                    if (files[i].length() == 0) {
                        files[i].delete();
                        count++;
                    }
                }
            }
        }
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识Java语言(36):I/O流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值