Java-File

博文仅为个人学习记录,仅供参考


Java-File类

public class File extends Object implements Serializable, Comparable<File>

1.概述

File类是文件和目录的路径名的抽象表示。它封装的并不是一个真正的文件,而仅仅只是一个路径名,这个路径名表示的文件或者目录可以是存在的,也可以是不存在的,将来需要通过具体的操作来把这个路径的内容转换为具体存在的。

2.构造方法
方法名说明
File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例。
File(URI uri)通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

范例:

在这里插入图片描述

import java.io.File;

public class FileMain01 {
    public static void main(String[] args) {
        File file01=new File("D:\\Java\\test.txt");
        System.out.println(file01);//File类重写了toString()方法,输出的是路径名
        File file02=new File("D:\\Java\\","test.txt");//一般parent是目录,child是文件名
        System.out.println(file02);
        
        File file03=new File(new File("D:\\Java\\"),"test.txt");
        System.out.println(file03);
    }
}

编译运行:

D:\Java\test.txt
D:\Java\test.txt
D:\Java\test.txt

由上面的图中看到,D:\Java\test.txt这个文件是不存在的,但是File对象可以正确创建且输出,而且输出的是路径名,说明File类重写了toString()方法,而且File类只是把路径名封装成一个对象而已。

3.创建文件或者目录
方法名说明
public boolean createNewFile()当该抽象路径表示的不存在,创建一个以这个路径命名的新文件
public boolean mkdir()创建一个以此抽象路径命名的空目录
public boolean mkdirs()创建由此抽象路径命名的目录,包括任何必需但不存在的父目录

范例:

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

/*
File类创建功能:
    public boolean createNewFile():创建由此抽象路径名命名的文件
        1.文件存在,返回false
        2.文件不存在,返回true
 *  public boolean mkdir():创建由此抽象路径名命名的目录
        1.目录存在,返回false
        2.目录不存在,返回true
    public boolean mkdirs():创建由此抽象路径名命名的多级目录
        1.目录存在,返回false
        2.目录不存在,返回true

 * */
public class FileMain02 {
    public static void main(String[] args) throws IOException {
        public static void main(String[] args) throws IOException {
        //1.创建文件
        File file01=new File("D:\\Java\\newFile.txt");
        System.out.println(file01.createNewFile());//这里可能抛出一个IOException,暂时不处理,直接抛出
        System.out.println("------------");

        //2.创建目录
        File file02=new File("D:\\Java\\newDir");
        System.out.println(file02.mkdir());
        System.out.println("------------");
        //3.创建多级目录
        File file03=new File("D:\\Java\\parentDir\\childDir");
        System.out.println(file03.mkdirs());
        System.out.println("------------");
    }
    }
}

编译运行:

true
------------
true
------------
true
------------

可以看到,三个方法的返回结果都是true,说明都创建成功,到D:\Java\目录下检查一下:

在这里插入图片描述

在这里插入图片描述

如上面2张图所示,文件newFile.txt、目录newDir、多级目录parentDir\childDir均创建成功。

要说明的是,执行creatNewFile()方法时可能抛出IOException异常,因为会对路径名进行检查,如果路径或者文件名不合法,比如含有\ / . * ? < > |这些字符,都会抛出异常。在实际应用中应该捕获并处理这个异常。然而创建文件目录也可能有这样的问题,比如路径或者名称不合法,但是mkdir()方法并不抛出异常,也不捕获,而是检查不合法直接返回false,为什么这样做我也不是很能理解。比如下面的例子:

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File file02=new File("D:\\Java\\abcdef\\newDir");
        System.out.println(file02.mkdir());
        System.out.println("------------");
        File file03=new File("D:\\Java\\newDir<>*/");
        System.out.println(file03.mkdir());
        System.out.println("------------");
    }
}

编译运行:

false
------------
false
------------

file02的路径名不合法,因为不存在acbdef这个目录;file03的目录名不合法,因为含有非法字符。但是它们都直接返回false而不是抛出异常。

4.判断和获取

这里不给出方法的列表,直接看范例。首先在Module02\目录下新建了一个java.txt文件(使用的平台是IDEA):

在这里插入图片描述

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

public class FileMain03 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("Module02\\java.txt");
//        public boolean isDirectory():判断抽象路径名表示的是不是目录
//        public boolean isFile():判断抽象路径名表示的是不是文件
//        public boolean exists():判断抽象路径名表示的目录或者文件存不存在
        System.out.println(f1.isDirectory());
        System.out.println(f1.isFile());
        System.out.println(f1.exists());
        System.out.println("----------------");

//        public String getAbsolutePath():返回此抽象路径名的绝对路径名
//        public String getPath():将此抽象路径名转换为路径名字符串
//        public String getName():返回由此抽象路径名表示的文件或者目录的名称
        System.out.println(f1.getAbsolutePath());
        System.out.println(f1.getPath());
        System.out.println(f1.getName());

        System.out.println("----------------");

//        public String[] list():返回此抽象路径名表示的目录中的文件或目录的名称字符串数组
//        public File[] listFiles():返回此抽象路径名表示的目录中的文件或目录的File对象数组
        File f2 = new File("D:\\Java");
        String[] strArr = f2.list();
        for (String str : strArr) {
            System.out.println(str);
        }
        System.out.println("----------------");

        File[] files = f2.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                System.out.println(file);//File类重写了toString方法
            }
        }

    }
}

编译运行,控制台输出:

false
true
true
----------------
D:\Java\Projects\TestProject\Module02\java.txt
Module02\java.txt
java.txt
----------------
create file.txt
IntelliJ IDEA Community Edition 2020.2.2
jdk-11.0.8
jdk-9_汉化版.CHM
newDir
newFile.txt
parentDir
Projects
TestClass.java
TestInterface.java
TestMain.java
《Java核心技术 卷1 基础知识 (原书第10版)》.pdf
文档
----------------
D:\Java\create file.txt
D:\Java\jdk-9_汉化版.CHM
D:\Java\newFile.txt
D:\Java\TestClass.java
D:\Java\TestInterface.java
D:\Java\TestMain.java
D:\Java\《Java核心技术 卷1 基础知识 (原书第10版)》.pdf

值得说明的是public String[] list()public File[] listFiles()这两个方法都要求File类对象封装的是一个目录的抽象路径,如果是这个抽象路径表示目录不存在或者表示的是一个文件,那么这两个方法都会返回null,如果不对返回值进行判断运行时就可能抛出java.lang.NullPointerException。

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

public class FileMain03 {
    public static void main(String[] args) throws IOException {
//        public String[] list():返回此抽象路径名表示的目录中的文件或目录的名称字符串数组
//        public File[] listFiles():返回此抽象路径名表示的目录中的文件或目录的File对象数组
        File f2 = new File("D:\\Java\\abcdefg");//表示的目录不存在
        String[] strArr = f2.list();
        for (String str : strArr) {
            System.out.println(str);
        }
        System.out.println("----------------");
        File[] files = f2.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                System.out.println(file);//File类重写了toString方法
            }
        }

    }
}

编译运行:

Exception in thread "main" java.lang.NullPointerException
5.删除

如下面2张图所示,在D:\Java\Temp这个目录下,新建了文件file01.txt和目录dir02、dir03,在目录dir03下,有一个文件fil303.txt,然后通过File类的public boolean delete()方法对这些文件和目录进行删除操作。

在这里插入图片描述
在这里插入图片描述

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

public class FileMain04 {
    public static void main(String[] args) throws IOException {
        File f1=new File("D:\\Java\\Temp\\file01.txt");
//        public boolean delete():删除此抽象路径名表示的文件或目录
        System.out.println(f1.delete());

        File f2=new File("D:\\Java\\Temp\\dir02");
        System.out.println(f2.delete());

        File f3=new File("D:\\Java\\Temp\\dir03");
        System.out.println(f3.delete());

    }
}

编译运行,控制台输出结果:

true
true
false

从结果中看出,f1和f2表示的文件(目录)成功进行了删除操作,但是f3执行的delete()返回的是false,说明没有删除成功,到文件夹中去查看一下:

在这里插入图片描述

确实,file01.txt和dir02都成功删除了,但是dir03没有被删除,原因是dir03不是一个空目录,它下面含有一个文件file03.txt,如果想删除一个目录,则必须先删除下面所有的目录和文件。

package com.day17;

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

public class FileMain04 {
    public static void main(String[] args) throws IOException {

        File f4=new File("D:\\Java\\Temp\\dir03\\file03.txt");
        System.out.println(f4.delete());
        File f3=new File("D:\\Java\\Temp\\dir03");
        System.out.println(f3.delete());
    }
}

编译运行,控制台输出:

true
true

上面的代码先对file03.txt进行删除操作,这样dir03就成为了一个空目录,再对dir03进行删除操作,返回true。在文件夹中查看:

在这里插入图片描述

可以看到,dir03被删除了。

6.展开目录

如何展开一个目录:如果目录下是文件,直接获取;如果目录下是目录,继续展开。按照这个思想,可以使用递归调用的方式来实现目录的展开。定义一个递归方法void openDir(File f),方法的逻辑是这样的:

  1. 利用 File[] listFiles()方法获取f下的所有目录和文件的路径的File对象数组,假设命名为files。
  2. 遍历files数组,判断其中的元素files[i]
    • files[i]表示文件,直接输出文件名
    • files[i]表示目录,输出目录绝对路径名,继续展开,即调用openDir(files[i]);
public class FileMain05 {
    public static void main(String[] args) {
        File f=new File("D:\\Java\\Temp\\");
        openDir(f);
    }
    public static void openDir(File f){
        File[] files = f.listFiles();//获取f下的所有目录和文件的File对象数组
        //如果f封装的抽象路径表示的目录不存在或者表示的是一个文件,listFiles()会返回null,先做一个判断,否则在迭代中会抛出java.lang.NullPointerException,即空引用异常
        if(files!=null) {
            //这里用的是增强型for循环,也可以用普通for循环
            for (File file : files) {
                if (file.isFile()) {
                    System.out.println(file.getName());
                } else {
                    System.out.println("目录:" + file.getAbsolutePath());
                    openDir(file);
                }

            }
        }
    }
}

编译运行,控制台输出:

目录:D:\Java\Temp
目录:D:\Java\Temp
JavaEE.txt
目录:D:\Java\Temp\JavaEE
JavaEE01.txt
目录:D:\Java\Temp
JavaME.txt
目录:D:\Java\Temp
JavaSE.txt

看一下目录结构:

在这里插入图片描述


博文仅为个人学习记录,仅供参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值