从零开始学Java之轻松学会File文件操作

2023年 9月 12日 81.3k 0

作者:孙玉昌,昵称【一一哥】,另外 【壹壹哥】 也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

在前面的两篇文章中,壹哥给大家介绍了Java中的IO流及其API,现在你应该知道,IO流可以实现外部数据与内存之间的传输。接下来我们就要开始学习如何实现IO流的具体操作了,但很多时候,IO流都会操作一个文件,所以我们需要先学习在Java中如何操作文件,包括文件及文件夹的创建、遍历、删除等。有了文件操作的基础,我们才能更好地操作IO流。

------------------------------前戏已做完,精彩即开始----------------------------

全文大约 【4200】 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github: github.com/SunLtd/Lear…

Gitee: 一一哥/从零开始学Java

一. File文件类

1. 概述

在计算机系统中,文件是非常重要的信息存储方式。为了让我们方便的操作文件,Java标准库java.io包中给我们提供了一个非常重要的File文件类。该类是唯一代表磁盘文件本身的对象,它提供了访问和操作文件及目录的一系列方法。如果我们想在程序中操作文件和目录,比如新建、删除、写入、重命名文件,以及创建、移动和删除目录等操作,都可以通过File类来完成。

在Java中,File对象既可以表示文件,也可以表示目录。特别要注意的是,如果我们想构造一个File对象,即使传入的这个文件或目录不存在,代码也不会出错。这是因为构造一个File对象时,并不会有任何磁盘操作,只有当我们调用了File对象的某些方法时,才会真正地进行磁盘操作。

2. 构造方法

Java的File类给我们提供了如下几个构造方法,用于创建一个File对象:

  • File(String path):path表示路径,如果path是真实存在的路径,则该File对象表示的是一个目录;如果path是文件名,则该File对象表示的是一个文件。
  • File(String path, String name):path是路径名,name是文件名。
  • File(File dir, String name):dir是路径对象,name是文件名。

我们使用上面的任意构造方法,都可以创建出一个 File对象。创建出File对象后,我们就可以调用File对象的各种方法,对文件进行各种操作了。

3. 常用属性

另外在File类中还有两个很常用的静态常量属性,如下所示:

  • public static final String pathSeparator:分隔符,用于分隔连续的多个路径,在Windows中代表";"。
  • public static final String separator:路径分隔符,用来分隔同一个路径字符串中的目录,在Windows中代表"/"。

大家要注意,一般Windows的路径分隔符是反斜线“\”,而Java程序中的反斜线却表示转义字符。但Java程序支持将斜线当成平台无关的路径分隔符,所以如果我们需要在Windows的路径中使用路径,可以使用两条反斜线进行转义,或直接使用正斜线“/”。比如我们在Windows系统中有一个文件:D:\java\HelloWorld.java,在Java代码中,该路径的可以写成如下格式:

D:/java/HelloWorld.java 

或

D:\java\HelloWorld.java。

4. 常用方法

为了方便进行文件操作,File类给我们提供了多个方法,用于获取文件的属性、信息以及文件操作。下面壹哥给大家介绍一些常用的方法:

4.1 获取文件名和路径

  • getName():获取文件名;
  • getPath():获取文件路径;
  • getAbsolutePath():获取文件的绝对路径;
  • getParent():获取文件的父路径;
  • getParentFile():获取文件的父路径的File对象。

4.2 获取文件信息

  • length():获取文件的长度(以字节为单位);
  • lastModified():获取文件的最后修改时间,返回的是毫秒值;
  • exists():判断文件是否存在;
  • isFile():判断是否是文件;
  • isDirectory():判断是否是目录;
  • canRead():判断文件是否可读;
  • canWrite():判断文件是否可写。

4.3 文件操作

  • createNewFile():创建一个空文件,如果文件已经存在,则不创建;
  • delete():删除文件或目录,如果文件或目录不存在,则返回false;
  • mkdir():创建一个目录,如果目录已经存在,则不创建;
  • mkdirs():创建一个多级目录,如果目录已经存在,则不创建;
  • renameTo(File dest):将文件重命名为指定的文件名或路径。

4.4 遍历操作

  • list():遍历目录中的文件,返回由File对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File对象不是目录,则返回null;
  • list(FilenameFilter filter):返回文件数组中仅包含符合filter过滤器的文件和目录,如果filter为 null,则接受所有的名称。

接下来壹哥会通过一些案例来讲解这些方法的具体使用。

5. 创建文件和目录

如果我们想要使用File类来访问文件系统中的文件和目录,首先需要创建一个File对象。File类的构造方法有多种方式,接下来壹哥就说说几种常见的方式。

5.1 通过文件路径创建File对象

可以使用文件的路径创建一个File对象,例如:

File file = new File("F:/example/file.txt");

上面这行代码将创建一个File对象,它代表文件系统中路径为"F:/example/file.txt"的文件。但是大家要注意,File对象只是用来表示文件和目录的路径名,并不一定表示实际的文件和目录。如果我们想操作实际的文件和目录,必须使用File对象的相关方法来执行操作。所以上面的这行代码,并不会真的创建出对应的目录和文件,我们需要通过mkdir()、mkdirs()和createNewFile()方法才能创建出对应的目录和文件。

另外还请大家注意,即使该文件不存在,也不会报错。而且该文件是一个空白的文件,如果我们想往该文件中添加内容,需要利用IO流往里添加内容。完整代码如下:

public class Demo01 {
	public static void main(String[] args) {
        //使用分隔符常量,屏蔽不同系统的路径符号差异
        //String path="F:" + File.separator + "example" + File.separator + "file.txt";
        //File file = new File(path);
        //path=F:\example\file.txt
        //System.out.println("path="+file.getPath());
		
        //该行代码只是创建出File对象,但并不会真的创建出对应的目录和文件
        File file = new File("F:/example/file.txt");
        try {
            // 文件操作
            if (!file.exists()) {
                //真正的创建文件
                file.createNewFile();
                System.out.println("文件创建成功!");
            } else {
                System.out.println("文件已经存在!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
	}
}

大家要注意,如果我们的代码要运行在不同的操作系统中,路径的分隔符是不一样的,例如:

  • Windows中使用反斜杠\表示目录的分隔符;
  • Linux中使用正斜杠/表示目录的分隔符。

所以为了让我们的程序具有更好的可移植性,可以在编写路径时根据程序所在的操作系统,使用符合本地操作系统要求的分隔符,此时就可以使用File类提供的两个分隔符常量。

5.2 通过父目录和子文件名创建File对象

我们还可以使用父目录和子文件名来创建一个File对象,例如:

File parentDir = new File("F:/example"); 
File file = new File(parentDir, "file.txt");

这行代码会创建一个File对象,它代表文件系统中路径为"F:/example/file.txt"的文件。如果父目录不存在,会自动创建出来。

5.3 通过URI创建File对象

我们还可以使用URI(统一资源标识符)创建一个File对象,例如:

File file = new File(new URI("file:///F:/example/file.txt"));

该代码会创建一个File对象,它代表文件系统中路径为"F:/example/file.txt"的文件。请注意,如果我们使用的URI格式不正确,会抛出异常。

5.4 创建单个目录

除了能创建文件,File类还提供了访问和操作文件系统中目录的方法。我们可以使用mkdir()方法创建单个目录。例如,以下代码会创建出一个名为"example"的目录。

import java.io.File;
public class Demo01 {
    public static void main(String[] args) {
        //该行代码只是创建出File对象,但并不会真的创建出对应的目录和文件
        //File file = new File("F:/example/file.txt");		
        File dir = new File("F:/example");
        if (!dir.exists()) {//判断目录是否存在
            //如果目录不存在,则创建出来
            boolean success = dir.mkdir();
            if (success) {
                System.out.println("目录创建成功");
            } else {
                System.out.println("目录创建失败");
            }
        }
    }
}

5.5 创建多级目录

我们还可以使用mkdirs()方法来创建出一个多级目录,如果目录已经存在,则不创建。

import java.io.File;
public class Demo01 {
    public static void main(String[] args) {
        //创建多级目录
        File dirs = new File("F:\testDir\testSubDir");
        if (dirs.mkdirs()) {
            System.out.println("多级目录创建成功!");
        } else {
            System.out.println("多级目录已经存在!");
        }
    }
}

6. 获取文件信息

创建出File文件和目录之后,接下来我们还可以获取文件与目录的相关信息,File类提供了多个方法用于获取文件的属性及信息,使用起来很方便,案例如下:

public class Demo03 {
    public static void main(String[] args) {
        //创建单级目录
        File file = new File("F:/example/file.txt");
		
        // 获取文件名和路径
        System.out.println("文件名:" + file.getName());
        System.out.println("文件路径:" + file.getPath());
        System.out.println("文件绝对路径:" + file.getAbsolutePath());
        System.out.println("文件父路径:" + file.getParent());
        System.out.println("文件父路径File对象:" + file.getParentFile());

        // 获取文件信息
        System.out.println("文件长度:" + file.length());
        System.out.println("最后修改时间:" + file.lastModified());
        System.out.println("是否存在:" + file.exists());
        System.out.println("是否是文件:" + file.isFile());
        System.out.println("是否是目录:" + file.isDirectory());
        System.out.println("是否可读:" + file.canRead());
        System.out.println("是否可写:" + file.canWrite());
    }
}

7. 重命名与移动文件

如果我们需要将一个文件重命名,或者是把文件从一个位置移动到另一个位置,可以使用renameTo()方法。

public class Demo04 {
    public static void main(String[] args) {
        File oldFile = new File("F:/example/newFile2.txt");
        File newFile = new File("F:/example2/newFile22.txt");
        if(oldFile.exists()) {
            //重命名文件。如果新文件所在的目录与之前的文件不是同一目录,则可以实现文件的移动,否则就是单纯重命名
            boolean result = oldFile.renameTo(newFile);
            if(result) {
                System.out.println("重命名成功");
            }else {
                System.out.println("重命名失败");
            }
         }
    }
}

大家要注意,如果新文件所在的目录与之前的旧文件不在同一目录,则会实现文件的移动,否则就是单纯重命名。

8. 删除文件和目录

我们可以使用delete方法来删除一个文件或目录。

public class Demo05 {
    public static void main(String[] args) {
        File file = new File("F:/example/file.txt");
        if(file.exists()) {
            boolean result = file.delete();
            if(result) {
                System.out.println("删除成功");
            }else {
                System.out.println("删除失败");
            }
        }
    }
}

9. 遍历文件

我们可以使用list()方法来遍历一个目录。假设我们想遍历C盘根目录下的所有文件和目录,并显示出文件或目录名称、类型及大小,则实现代码如下:

public class Demo06 {
    public static void main(String[] args) {
        File file = new File("C:/");
        // 调用不带参数的list()方法
        String fileList[] = file.list(); 
        for (int i = 0; i < fileList.length; i++) { // 遍历返回的字符数组
            System.out.print(fileList[i] + "\t\t");
            System.out.print((new File("F:/", fileList[i])).isFile() ? "文件" + "\t\t" : "文件夹" + "\t\t");
            System.out.println((new File("F:/", fileList[i])).length() + "字节");
        }
    }
}

大家要注意,list()方法返回的数组中只包含文件名称,但不包含路径,也不保证所得数组中相同的字符串会以特定顺序出现,特别是不保证它们会按字母顺序出现。

二. Path路径类

1. 概述

为了方便我们进行文件路径的操作,Java 7中还给我们提供了一个Path类,它位于java.nio.file包中,是一个用于操作文件路径的工具类。Path对象和File对象类似,但操作起来更简单。

2. Path对象创建方式

我们在使用Path类之前,需要先创建一个Path对象,Java中给我们提供了多种创建Path对象的方式。接下来壹哥就给大家说一下这几种方法的使用。

2.1 通过文件路径字符串创建

我们可以使用Path类的静态方法get(String first, String... more)来创建一个Path对象。其中,第一个参数是文件路径的根路径,第二个参数及以后的参数是路径的各个部分。

Path path = Path.get("F:/workspace", "test", "example.txt");

2.2 通过URI创建

我们可以使用Path类的静态方法get(URI uri)创建Path对象,URI可以是一个本地文件路径,也可以是一个远程文件路径。

URI uri = new URI("file:///F:/workspace/test/example.txt"); 
Path path = Path.get(uri);

2.3 通过文件对象创建

我们还可以使用文件对象的toPath()方法创建Path对象。

File file = new File("D:/workspace/test/example.txt"); 
Path path = file.toPath();

2.4 通过系统属性创建

另外还可以使用系统属性user.dir获取当前工作目录,然后通过Path类的静态方法get(String first, String... more)创建一个Path对象。

Path path = Path.get(System.getProperty("user.dir"), "test", "example.txt");

3. 常用方法

创建出Path对象之后,就可以通过Path类给我们提供的一些常用方法,如创建、删除、移动、复制等,对文件路径进行操作了。以下是壹哥总结的Path对象方法的使用案例,大家来看看吧。

3.1 toAbsolutePath()

获取绝对路径。

Path path = Path.get("test", "example.txt"); 
Path absolutePath = path.toAbsolutePath();

3.2 getParent()

获取父路径。

Path path = Path.get("test", "example.txt"); 
Path parentPath = path.getParent();

3.3 getFileName()

获取文件名。

Path path = Path.get("test", "example.txt"); 
Path fileName = path.getFileName();

3.4 getNameCount()

获取路径名称的数量。

Path path = Path.get("F:/workspace/test/example.txt"); 
int nameCount = path.getNameCount();

3.5 getName(int index)

获取指定索引位置的路径名称。

Path path = Path.get("F:/workspace/test/example.txt"); 
Path name = path.getName(2); // 返回test

3.6 subpath(int beginIndex, int endIndex)

获取路径的子路径。

Path path = Path.get("F:/workspace/test/example.txt"); 
Path subPath = path.subpath(0, 2); // 返回F:/workspace/test

3.7 startsWith(Path other)

判断当前路径是否以指定路径开始。

Path path = Path.get("F:/workspace/test/example.txt"); 
Path otherPath = Path.get("F:/workspace/test"); 
boolean startsWith = path.startsWith(otherPath); // 返回true

好了,以上就是Path类及其方法的使用了,是不是很简单呢?

------------------------------正片已结束,来根事后烟----------------------------

四. 结语

至此,壹哥就把File和Path对象给大家介绍完毕了,今天的重点内容如下:

  • 创建File对象本身不涉及IO操作;
  • File类提供了多个创建对象的构造方法;
  • 掌握File文件和目录的创建、删除、重命名等方法。

在下一篇文章中,壹哥会带大家真正地开始学习IO流的操作,并且会结合IO流来读写一个文件的内容,敬请关注哦。另外如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论