首页 > 编程笔记 > Java笔记 阅读:3

Java File文件操作类详解(附带实例)

我们都知道计算机一般会将信息存储在硬盘上,为了方便管理,这些信息会被划分为文件和目录的形式来进行存储,并且以树结构来组织它们,比如下面的文件目录结构。
父目录
  ├─目录1
  │  ├─文件1.jpg
  │  ├─文件2.jpg
  │
  ├─目录2
  ├─目录3
  │  ├─文件1.txt
  │  ├─文件2.txt
  │  ├─文件3.txt
  │
  └─目录4
    ├─文件1.jpg
    ├─文件2.jpg
    ├─文件3.jpg
    ├─文件4.jpg
在我们使用的 Windows 系统中打开 C 盘后就会看到很多目录和文件。

为了能访问操作系统中的文件,Java 提供了 File 类来抽象文件和目录,通过该类就能操作对应路径的文件或目录,该类位于 java.io 包内。如果我们想要创建、删除、重命名某个文件等,都可以通过 Fil e类提供的方法来实现。

需要注意的是,File 类没有直接提供访问文件内容的方法,如果要写入或读取文件内容,则还需要与输入输出流结合才能实现。

Java File创建和删除文件或目录

如果想对文件或目录进行操作则需要创建 File 对象,可以通过下面的 4 种构造方法来创建 File 对象,我们可以根据实际情况选择相应的构造方法。
File(String pathname)
File(String parent, String child)
File(File parent, String child)
File(URI uri)
下面我们分别对这 4 种构造方法中传入的参数进行解释:
为了方便分步观察,我们通过 JShell 来执行文件的创建和删除操作。先看如何创建一个文件,只需指定好路径创建一个 File 对象,然后就可以调用 createNewFile() 方法来创建文件:
jshell> File f = new File("D:/java/test.txt");
f ==> D:\java\test.txt

jshell> f.createNewFile();
$24 ==> true

jshell> f.createNewFile();
$25 ==> false
注意,初次调用该方法返回 true,表示创建成功,而再次调用则会返回 false,这是因为该文件已经存在。

再看文件删除操作,同样是先指定一个路径创建 File 对象,然后就可以调用 delete() 方法进行文件删除:
jshell> File f = new File("D:/java/test.txt");
f ==> D:\java\test.txt

jshell> f.delete();
$32 ==> true

jshell> f.delete();
$33 ==> false
初次调用该方法返回 true,表示删除成功,再次调用返回 false,因为已经不存在该文件了。

目录与文件的操作类似,如下面的程序所示:
jshell> File f = new File("D:/java/test");
f ==> D:\java\test

jshell> f.mkdir();
$44 ==> true

jshell> f.mkdir();
$45 ==> false

jshell> f.delete();
$46 ==> true
我们先指定一个目录路径并创建 File 对象,然后就可以调用 mkdir() 方法来创建目录,再次调用返回 false,因为已经存在该目录了。最后我们调用 delete() 方法来删除该目录,注意删除的目录必须为空目录,如果目录包含了子目录或文件则无法删除。

Java File文件目录的路径

创建 File 对象时需要我们指定文件或目录的路径,路径分为绝对路径和相对路径两大类。

绝对路径就是完整的路径,比如“C:/Windows/Web/1.jpg”就是一个完整的路径,不管程序所在的当前目录是什么,都能通过完整路径定位到指定文件。

相对路径则如其名,它是一种相对于当前目录而言的路径,比如假设程序当前所在目录为“C:/Windows”,那么相对路径“1.jpg”所对应的完整路径为“C:/Windows/1.jpg”。

以下特殊符号能用在相对路径中:
比如“./1.jpg”表示“C:/Windows/1.jpg”,再如“../1.jpg”表示“C:/1.jpg”。

接着来看一个问题,“C:/Windows/1.jpg”和“C:\Windows\1.jpg”两个路径是不是一样的呢?它们所表示的文件路径是一样的,只是路径分隔符不同而已。在 Windows 系统中的文件路径是以“\”符号进行分隔的,而 Linux 系统中则是使用“/”符号来分隔。

一般来说我们推荐在 Java 中使用“/”符号作为文件路径的分隔符,因为这个符号在 Windows 和 Linux下 都能正常运行,Java 语言对该符号进行了兼容处理。而如果选择“\”符号作为分隔符的话则在 Java 中需要写成“\\”,即两个“\”,因为 Java 中的“\”必须通过转义字符来表示。

下面 4 种路径分隔符写法中的前三种都能正常编译及运行,并能正确表示路径,而最后一种则会导致编译时报错:
File f = new File("D:/java/test.txt");
File f2 = new File("D://java//test.txt");
File f3 = new File("D:\\java\\test.txt");
File f4 = new File("D:\java\test.txt");

Java File类的常用方法

File 类包含了很多对文件操作的方法,下表是常用的方法及其描述。这些操作包括获取文件的相关属性、判断文件或目录是否存在、遍历指定目录下的所有文件以及创建和删除文件或目录等。

表:File 类的常用方法
方法 描述
boolean canExecute() 检测当前程序是否有对指定文件的执行权限
boolean canRead() 检测当前程序是否有对指定文件的读取权限
boolean canWrite() 检测当前程序是否有对指定文件的写入权限
boolean exists() 检测当前 File 对象对应的文件是否存在
boolean isAbsolute() 检测当前 File 对象对应的文件路径是否为绝对路径
boolean isDirectory() 检测当前 File 对象是否为目录
boolean isFile() 检测当前 File 对象是否为文件
boolean isHidden() 检测当前 File 对象是否为隐藏文件
String getAbsolutePath() 获取当前 File 对象的绝对路径
String getCanonicalPath() 获取当前 File 对象的标准的绝对路径
String getName() 获取文件名或目录名
String getParent() 获取文件或目录的父目录路径
String getPath() 返回构造方法传入的路径
long lastModified() 获取当前 File 对象的最后修改时间,返回值是 long 型,表示从“1970.1.1 00:00:00”开始到当前时间的总毫秒数
long length() 获取当前 File 对象的文件长度
String[] list() 获取当前目录下的所有文件、目录名
File[] listFiles() 获取当前目录下的所有文件、目录对象
boolean createNewFile() 根据指定文件路径来创建新文件,前提是该文件尚不存在,创建成功则返回 true,创建失败则返回 false
boolean delete() 根据指定文件路径来删除文件,如果删除的是目录则要求该目录必须为空,删除成功则返回 true,删除失败则返回 false
boolean mkdir() 创建指定目录
boolean renameTo(File dest) 重命名为指定文件名

Java File文件重命名

下面我们来看看文件重命名操作:
jshell> File f = new File("D:/java/test.txt");
f ==> D:\java\test.txt

jshell> File f2 = new File("D:/java/testtest.txt");
f2 ==> D:\java\testtest.txt

jshell> f.createNewFile();
$53 ==> true

jshell> f.renameTo(f2);
$54 ==> true
首先创建 f 和 f2 两个 File 对象,然后执行“f.createNewFile()”创建文件,最后执行“f.renameTo(f2)”将文件名改为“testtest.txt”。

Java File判断文件是否存在

要判断文件或目录是否存在可以通过 exists() 方法来实现,下面的实例中先创建“D:/java/test.txt”文件,然后调用 exists() 方法,返回 true 表示该文件存在。类似地,如果检测的是“D:/java”目录,同样是存在的。
jshell> File f = new File ("D:/java/test.txt");
f ==> D:\java\test.txt

jshell> f.createNewFile();
$56 ==> true

jshell> f.exists();
$57 ==> true

jshell> File f = new File("D:/java/");
f ==> D:\java

jshell> f.exists();
$59 ==> true

Java File获取文件属性

文件的属性包括文件大小、最后修改时间、是否可读可写等,我们可以通过下面实例对应的输出结果仔细观察每一项属性。
public class FileTest {
    public static void main(String[] args) throws IOException {
        File f = new File("D:/java/test.txt");
        System.out.println("文件是否有可执行权限:" + f.canExecute());
        System.out.println("文件是否可读:" + f.canRead());
        System.out.println("文件是否可写:" + f.canWrite());
        System.out.println("是否为绝对路径:" + f.isAbsolute());
        System.out.println("是否为目录:" + f.isDirectory());
        System.out.println("是否为文件" + f.isFile());
        System.out.println("是否为隐藏文件:" + f.isHidden());
        System.out.println("文件最后修改时间:" + new Date(f.lastModified()));
        System.out.println("文件大小:" + f.length());
        System.out.println("文件的绝对路径为:" + f.getAbsolutePath());
        System.out.println("文件的标准路径为:" + f.getCanonicalPath());
        System.out.println("文件名为:" + f.getName());
        System.out.println("父目录路径为:" + f.getParent());
        System.out.println("构造方法传入的路径为:" + f.getPath());
    }
}
输出结果为:
文件是否有可执行权限:true
文件是否可读:true
文件是否可写:true
是否为绝对路径:true
是否为目录:false
是否为文件true
是否为隐藏文件:false
文件最后修改时间:Sat Apr 30 10:08:46 CST 2022
文件大小:0
文件的绝对路径为:D:\java\test.txt
文件的标准路径为:D:\java\test.txt
文件名为:test.txt
父目录路径为:D:\java
构造方法传入的路径为:D:\java\test.txt

Java File遍历文件和目录

遍历文件和目录可以使用 listFiles() 方法,下面是程序中使用的路径是“.”,表示程序运行的当前目录。
public class FileTest {
    public static void main(String[] args) throws IOException {
        File f = new File(".");
        File[] fs = f.listFiles();
        for (File file : fs) {
            System.out.println(file.getName());
        }
    }
}
输出如下,可以看到成功遍历了所有文件和目录:

.classpath
.project
.settings
bin
src
test.txt

相关文章