Java File文件操作类详解(附带实例)
我们都知道计算机一般会将信息存储在硬盘上,为了方便管理,这些信息会被划分为文件和目录的形式来进行存储,并且以树结构来组织它们,比如下面的文件目录结构。
为了能访问操作系统中的文件,Java 提供了 File 类来抽象文件和目录,通过该类就能操作对应路径的文件或目录,该类位于 java.io 包内。如果我们想要创建、删除、重命名某个文件等,都可以通过 Fil e类提供的方法来实现。
需要注意的是,File 类没有直接提供访问文件内容的方法,如果要写入或读取文件内容,则还需要与输入输出流结合才能实现。
为了方便分步观察,我们通过 JShell 来执行文件的创建和删除操作。先看如何创建一个文件,只需指定好路径创建一个 File 对象,然后就可以调用 createNewFile() 方法来创建文件:
再看文件删除操作,同样是先指定一个路径创建 File 对象,然后就可以调用 delete() 方法进行文件删除:
目录与文件的操作类似,如下面的程序所示:
绝对路径就是完整的路径,比如“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 种路径分隔符写法中的前三种都能正常编译及运行,并能正确表示路径,而最后一种则会导致编译时报错:
父目录 ├─目录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 种构造方法中传入的参数进行解释:
- 第一种构造方法传入文件或目录路径的字符串,比如“C:/Windows/comsetup.log”或“C:/Windows”。
- 第二种构造方法传入两个路径字符串,分别为父串和子串,两者连起来作为完整的文件或目录路径,比如“C:/Windows”和“Web/1.jpg”连起来就是“C:/Windows/Web/1.jpg”。
- 第三种构造方法与第二种类似,只是父串变为 File 类。
- 第四种构造方法传入的是 URI 路径,URI 路径是一种网络地址,比如“http://www.×××.com/welcome.html”。
为了方便分步观察,我们通过 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 类包含了很多对文件操作的方法,下表是常用的方法及其描述。这些操作包括获取文件的相关属性、判断文件或目录是否存在、遍历指定目录下的所有文件以及创建和删除文件或目录等。方法 | 描述 |
---|---|
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