Java SE: 一文彻底搞懂File类

简介: Java SE: 一文彻底搞懂File类

编译软件:IntelliJ IDEA 2019.2.4 x64

运行环境:win10 家庭中文版

jdk版本:1.8.0_361

提示:以下是本篇文章正文内容,下面案例可供参考

一、File类是什么?

说到File,也许有人会想到是在windows电脑中被我们熟练使用的众多文件,如word文件,ppt文件等;也许是mac笔记本下的众多文件。但在Java编程语言中,它却并不代表文件本身。

File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,也可以跨平台使用File。File类可以新建文件、删除文件、重命名文件和目录等。

在API中File的解释是文件和目录路径名的抽象表示形式,即File类是文件或目录的路径,而不是文件本身 ,因此我们在使用File类的时候,并不能直接访问文件内容它本身,如果需要访问文件内容本身,则需要使用输入/输出流。

例如:要表示Windows操作系统下的C盘桌面下的《打穿西游的唐僧》.txt,可以这样表示:File file=new File(“C:\Users\king\Desktop\《打穿西游的唐僧》.txt”);

二、构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    代码如下(示例):
@Test
    public void  test21(){
        // 文件路径名
        String pathname="C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt";
        File file=new File(pathname);
    }
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
    代码如下(示例):
@Test
    public void test22(){
        // 通过父路径和子路径字符串
        String parent = "C:\\Users\\king\\Desktop";
        String child = "《打穿西游的唐僧》.txt";
        File file3 = new File(parent, child);
    }
  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
    代码如下(示例):
@Test
 public void test23(){
    // 通过父级File对象和子路径字符串
        File parentDir = new File("C:\\Users\\king\\Desktop");
        String childFile = "《打穿西游的唐僧》.txt";
        File file4 = new File(parentDir, childFile);
}

🔔注意

  • 一个File对象代表硬盘或网络中可能存在的一个文件或目录。
  • 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
  • 如果File对象代表的文件或目录存在,则File对象实例初始化时,就会用硬盘中对应文件或目录的属性信息(例如,时间、类型等)为File对象的属性赋值,否则除了路径和名称,File对象的其他属性将会保留默认值。

三、常用方法

3.1 获取文件和目录基本信息

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

案例需求:求D:\Test下所有的文件大小

代码如下(示例):

@Test
    public void test07(){
        //求D:\Test下所有的文件大小
        File dir=new File("D:\\Test");
//        System.out.println((getFileSize(dir))+"字节");
        System.out.println(getFileLength(dir));
    }
  public long getFileLength(File dir){
        long sum=0;
        if (dir.isFile()){
            sum+=dir.length();
        }else if (dir.isDirectory()){
            File[] files = dir.listFiles();
            for (File sub : files) {
                sum+=getFileLength(sub);
            }
        }
        return sum;
    }

  • public String getPath() : 将此File转换为路径名字符串。
  • public long lastModified(): 返回Fle对象对应的文件或目录的最后修改时间(毫秒值)
    代码如下(示例):
@Test
    public void test02(){
        File file1=new File("C:\\\\Users\\\\king\\\\Desktop\\\\《打穿西游的唐僧》.txt");
        System.out.println(file1.getName());//文件名
        System.out.println(file1.length());//文件大小
        System.out.println(file1.getPath());//文件的路径
        long time=file1.lastModified();//文件的最后修改时间(毫秒值)
        Date date=new Date(time);
        System.out.println(date);
    }

🔔注意

💡小tips: 如果文件类对象是一个目录,它使用length()方法得到的文件大小是不准确的

不信?请看如下代码演示:

@Test
    public void test03(){
        //以文件夹举例
        File file1=new File("C:\\Users\\king\\Desktop\\桌面清理");
        System.out.println(file1.getName());
        System.out.println(file1.length());
        System.out.println(file1.getPath());//4096
        long time=file1.lastModified();
        Date date=new Date(time);
        System.out.println(date);
    }

😖 API中的解释:

public long length() :返回由此抽象路径名表示的文件的长度。

如果此路径名表示一个目录,则返回值是不确定的。

3.2 判断功能

  • public boolean exists():此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。
    代码如下(示例):
@Test
    public void test06() throws IOException{
        File f = new File("C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt");
        File f2 = new File("C:\\Users\\king\\Desktop");
        // 判断是否存在
        System.out.println("C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt 是否存在:"+f.exists());
        System.out.println("C:\\Users\\king\\Desktop 是否存在:"+f2.exists());
        // 判断是文件还是目录
        System.out.println("C:\\Users\\king\\Desktop 文件?:"+f2.isFile());
        System.out.println("C:\\Users\\king\\Desktop 目录?:"+f2.isDirectory());
    }

3.2 创建 or 删除文件/目录

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete() :删除由此File表示的文件或目录。 只能删除空目录。
  • public boolean mkdir() :创建由此File表示的目录。
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
    代码如下(示例):
@Test
    public void test07() throws IOException{
        // 文件的创建
        File f = new File("a.txt");
        System.out.println("a.txt是否存在:"+f.exists());
        System.out.println("a.txt是否创建:"+f.createNewFile());
        System.out.println("a.txt是否存在:"+f.exists());
        // 目录的创建
        File f2= new File("myDir");
        System.out.println("myDir是否存在:"+f2.exists());
        System.out.println("myDir是否创建:"+f2.mkdir());
        System.out.println("myDir是否存在:"+f2.exists());
        // 创建一级目录
        File f3= new File("myDir_a\\myDir1");
        System.out.println("myDir_a\\myDir1创建:" + f3.mkdir());//myDir_a\myDir1创建:false  mkdir()如果要创建若父目录不存在的子目录的话,必然失败
        File f4= new File("myDir_a\\myDir2");
        System.out.println("myDir_a\\myDir2创建:" + f4.mkdir());//myDir_a\myDir2创建:false mkdir()如果要创建若父目录不存在的子目录的话,必然失败
        // 创建多级目录
        File f5= new File("myDir_a\\myDirs");
        System.out.println("myDir_a\\myDirs创建:" + f5.mkdirs());//myDir_a\myDirs创建:true  mkdirs()可以创建任何必需但不存在的父目录。
        // 文件的删除
        System.out.println("a.txt删除:" + f.delete());//a.txt删除:true
        // 目录的删除
        System.out.println("myDir删除:" + f2.delete());//myDir删除:true  myDir是空目录
        System.out.println("myDira\\myDir2删除:" + f4.delete());//myDira\myDir2删除:false  delete()只能删除空目录
    }

案例:递归删除非空文件夹

@Test
public void test08(){
    //递归删除非空文件夹
    File dir=new File("D:\\Test - 副本");
    recursiveDeleteDirctor(dir); //此删除是不是放到回收站,而是真删除,直接干掉
}
public void recursiveDeleteDirctor(File dir){
    if (dir.isDirectory()){
        File[] files = dir.listFiles();
        for (File sub : files) {
            recursiveDeleteDirctor(sub);
        }
    }
    dir.delete();
}

3.3 列出目录的下一级

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
    代码如下(示例):
@Test
    public void test08() throws IOException{
        //C:\Users\king\Desktop目录中的所有子文件或目录
        File dir=new File("C:\\Users\\king\\Desktop");
        String[] list = dir.list();
        for (String s : list) {
            System.out.println(s);
        }
    }

  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
    代码如下(示例):
@Test
    public void test09() throws IOException{
        //C:\Users\king\Desktop目录中的所有子文件或目录
        File dir=new File("C:\\Users\\king\\Desktop");
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file.getName());
        }
    }

  • public File[] listFiles(FileFilter filter):**返回所有满足指定过滤器的文件和目录。**如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(File pathname)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
  • public String[] list(FilenameFilter filter)返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
  • public File[] listFiles(FilenameFilter filter)返回返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter .accept(File dir, String name)方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。
    案例:获取D:\Test下所有的.jpg图片
    代码如下(示例):
@Test
    public void test06(){
        //获取D:\Test下所有的.jpg图片
        File dir=new File("D:\\Test");
        getJpgImage(dir);
    }
  public void getJpgImage(File dir){
      if (dir.isDirectory()){
      File[] files = dir.listFiles(new FileFilter() {
        @Override
        //   返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(".jpg") || pathname.isDirectory();
        }
    });
    for (File sub : files) {
        if (sub.isDirectory()){
            getJpgImage(sub);
        }else {
            System.out.println(sub);
        }
    }
}
}


四、路径问题

File类可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径.

默认情况下,系统总是依据用户的工作路径来解释相对路径,这个路径由系统属性“user.dir"指定,通常也就是运行lava虚拟机时所作的路径。

常用方法

  • public String getPath() :将此File转换为路径名字符串。
  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
  • String getCanonicalPath():返回此File对象所对应的规范路径名。
  • 绝对路径: 在描述文件或文件夹时,从根目录开始导航的路径

对于windows操作系统来说,盘符就是根 : d:/Download d:/Download/1.txt

对于Linux操作系统来说,/就是根: /Download

代码如下(示例):

@Test
    public void test1() throws IOException {
        File f1 = new File("C:\\Users\\king\\Desktop\\《打穿西游的唐僧》.txt"); //绝对路径
        System.out.println("文件/目录的名称:" + f1.getName());
        System.out.println("文件/目录的构造路径名:" + f1.getPath());
        System.out.println("文件/目录的绝对路径名:" + f1.getAbsolutePath());
        System.out.println("文件/目录的规范路径名:" + f1.getCanonicalPath());
        System.out.println("文件/目录的父目录名:" + f1.getParent());
    }

@Test
    public void test04()throws IOException{
        File f2 = new File("/HelloIO.java");//绝对路径,从根路径开始
        System.out.println("文件/目录的名称:" + f2.getName());
        System.out.println("文件/目录的构造路径名:" + f2.getPath());
        System.out.println("文件/目录的绝对路径名:" + f2.getAbsolutePath());
        System.out.println("文件/目录的规范路径名:" + f2.getCanonicalPath());
        System.out.println("文件/目录的父目录名:" + f2.getParent());
    }

  • 相对路径:在描述文件或文件夹时,不是从根目录开始导航的路径

例如: download/1.txt 相对谁呢?

相当于在IDEA中,JUnit的test 方法,相对路径是相于当前的模块

@Test
    public void test05() throws IOException {
        File f3 = new File("HelloIO.java");//相对路径
        System.out.println("user.dir =" + System.getProperty("user.dir"));//System.getProperty:获取系统属性
        System.out.println("文件/目录的名称:" + f3.getName());
        System.out.println("文件/目录的构造路径名:" + f3.getPath());
        System.out.println("文件/目录的绝对路径名:" + f3.getAbsolutePath());
        System.out.println("文件/目录的规范路径名:" + f3.getCanonicalPath());
        System.out.println("文件/目录的父目录名:" + f3.getParent());
    }

  • 构造路径:在new File对象时,在()中填写的路径。

构造路径可以是相对路径,也可以绝对路径

-规范路径:所谓规范路径名,即对路径中的“…”等进行解析后的路径名

💡小tips:

  • 当构造路径是绝对路径时,那么getPath和getAbsolutePath结果一样
  • 当构造路径是相对路径时,那么getAbsolutePath的路径 = user.dir的路径 + 构造路径
  • 路径中如果出现“…”表示上一级目录,路径名如果以“/”开头,表示从“根目录”下开始导航。
相关文章
|
1天前
|
Java
Java对象和类研究
Java对象和类研究
6 0
|
1天前
|
XML Java 测试技术
Java异常处理神器:Guava Throwables类概念与实战
【4月更文挑战第29天】在Java开发中,异常处理是保证程序稳定性和可靠性的关键。Google的Guava库提供了一个强大的工具类Throwables,用于简化和增强异常处理。本篇博客将探讨Throwables类的核心功能及其在实战中的应用。
7 2
|
1天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
5天前
|
人工智能 安全 Java
Java8 - LocalDateTime时间日期类使用详解
Java8 - LocalDateTime时间日期类使用详解
|
6天前
|
缓存 Java 程序员
|
6天前
|
安全 Java 程序员
|
6天前
|
Java
一文搞清楚Java中的包、类、接口
包、类、接口、方法、变量、参数、代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分。
29 10
|
22天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
24 4
|
3月前
|
存储 Java 数据库连接
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段4
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段
28 0
|
8月前
|
安全 Java 开发者
【Java|多线程与高并发】JUC中常用的类和接口
JUC是Java并发编程中的一个重要模块,全称为Java Util Concurrent(Java并发工具包),它提供了一组用于多线程编程的工具类和框架,帮助开发者更方便地编写线程安全的并发代码。