theme: healer-readable
highlight: a11y-dark
哈喽,各位小伙伴们,你们好呀,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在Java开发中,文件IO操作是常见的操作之一,而文件操作的基础就是File类。File类提供了一系列的方法来操作文件和文件夹,它是Java文件和目录路径名的抽象表示。
摘要
在本文中,我们将会深入了解Java中的File类,探究它的应用场景、优缺点,并通过源代码解析和实际案例来演示如何使用File类。
File类
简介
在Java中,File类表示一个文件或者目录的路径。它提供了创建、删除、查询、修改文件和目录的方法。
File类的构造方法有以下几种:
File(String pathname)
:通过给定的路径名字符串创建一个新的File实例。File(String parent, String child)
:通过给定的父路径和子路径字符串创建一个新的File实例。File(File parent, String child)
:从给定的父抽象路径名和子路径名字符串创建一个新的File实例。
File类常用的方法包括:
exists()
:测试此抽象路径名表示的文件或目录是否存在。isDirectory()
:测试此抽象路径名表示的文件是否为目录。isFile()
:测试此抽象路径名表示的文件是否为标准文件。createNewFile()
:创建此抽象路径名指定的新文件。mkdir()
:创建此抽象路径名指定的目录。list()
:返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。renameTo(File dest)
:将此抽象路径名表示的文件重命名为指定的路径名。
源代码解析
以下是File类的源代码:
代码语言:java复制public class File implements Serializable, Comparable<File> {
//字段
private final String path;
//构造方法
public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
}
//方法
public boolean exists() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
}
public boolean isDirectory() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
return ((fs.getBooleanAttributes(this) & FileSystem.BA_DIRECTORY) != 0);
}
public boolean isFile() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
return ((fs.getBooleanAttributes(this) & FileSystem.BA_REGULAR) != 0);
}
//省略其他方法
}
可以看出,File类的实现非常简单,主要是对文件、目录的一些基本操作。实现了Serializable、Comparable<File> 接口。其中包含了一个字段path,表示文件路径。构造方法用于初始化File对象,被传入的参数pathname表示文件的路径。方法中包含了exists()、isDirectory()、isFile()等用于判断文件是否存在、是否是目录、是否是文件的方法,并通过调用FileSystem类的方法获取文件的属性进行判断。该代码还省略了其他方法。
如下是部分源码截图:
应用场景案例
下面通过一些具体案例,来演示File类的应用场景。
创建目录
代码语言:java复制File dir = new File("mydir");
if(!dir.exists()) {
dir.mkdir();
}
创建文件
代码语言:java复制File file = new File("myfile.txt");
if(!file.exists()) {
file.createNewFile();
}
删除文件
代码语言:java复制File file = new File("myfile.txt");
if(file.exists()) {
file.delete();
}
列出目录下的文件和目录名
代码语言:java复制File dir = new File("mydir");
if(dir.isDirectory()) {
String[] files = dir.list();
for(String fileName : files) {
System.out.println(fileName);
}
}
拓展:
这段代码的作用是遍历名为"mydir"的文件夹中的所有文件,如果该文件夹存在且是文件夹类型,那么将文件夹中所有文件的文件名打印出来。
具体分析如下:
- 创建一个File对象dir,指定文件夹路径为"mydir"。
- 调用isDirectory()方法判断该File对象对应的路径是否是一个文件夹,如果是则继续执行。
- 调用list()方法获取该文件夹中的所有文件名,保存到一个字符串数组中。
- 遍历该字符串数组,对于每一个文件名,将其打印出来。
注意:该代码并不会输出文件夹的名称,只会输出文件夹中的文件名。如果需要输出文件夹名称,可以将System.out.println(dir.getName())添加到代码中。
遍历目录下的文件和目录
代码语言:java复制public static void traverse(File file) {
if(file.isFile()) {
System.out.println(file.getPath());
} else if(file.isDirectory()) {
File[] files = file.listFiles();
for(File f : files) {
traverse(f);
}
}
}
拓展:
此代码为遍历文件系统中的所有文件和文件夹,并打印出所有文件的路径。
- 定义了一个静态方法
traverse()
,传入参数为File
类型的文件对象file
。 - 判断当前文件对象是否为文件,如果是文件,则打印出其路径。
- 如果不是文件,则判断其是否为文件夹,如果是文件夹,则获取该文件夹下所有文件和子文件夹,然后递归调用
traverse()
方法,对每个文件或子文件夹进行遍历操作。 - 当最底层的文件对象为文件时,执行步骤 2,打印出其路径,然后返回上一级执行步骤 3,继续遍历其他文件或文件夹。直到遍历完整个文件系统。
优缺点分析
优点
- File类提供了丰富的文件和目录操作方法,方便程序员进行文件IO操作。
- File类的使用非常简单,只要提供文件路径或文件名即可创建文件对象。
- File类的性能较好,适用于对大文件和目录的操作。
缺点
- File类在文件IO操作中对性能和内存的消耗较高,不适用于对大量的小文件的操作。
- File类无法实现文件锁定和并发操作,不适用于多线程环境下的文件操作。
类代码方法介绍
以下是File类中比较重要的方法介绍:
exists()
public boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
如果此抽象路径名表示的文件或目录存在,则返回 true;否则返回 false。
isDirectory()
public boolean isDirectory()
测试此抽象路径名表示的文件是否为目录。
如果此抽象路径名表示的文件为目录,则返回 true;否则返回 false。
isFile()
public boolean isFile()
测试此抽象路径名表示的文件是否为标准文件。
如果此抽象路径名表示的文件为标准文件,则返回 true;否则返回 false。
createNewFile()
public boolean createNewFile() throws IOException
创建此抽象路径名指定的新文件。
如果文件已存在,则不创建文件,并返回 false;否则创建一个新文件,返回 true。
mkdir()
public boolean mkdir()
创建此抽象路径名指定的目录。
如果目录已经存在,则不创建目录,并返回 false;否则创建一个新目录,返回 true。
list()
public String[] list()
返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
如果此抽象路径名不表示一个目录,则返回 null。
renameTo()
public boolean renameTo(File dest)
将此抽象路径名表示的文件重命名为指定的路径名。
如果重命名操作成功,则返回 true;否则返回 false。
测试用例
以下是一些测试用例:
测试目录创建和删除
代码语言:java复制public static void testDirectory() {
//测试目录创建
File dir = new File("mydir");
if(!dir.exists()) {
dir.mkdir();
}
//测试目录删除
if(dir.exists()) {
dir.delete();
}
}
拓展:
这段代码定义了一个静态的方法testDirectory(),用于测试目录的创建和删除。具体分析如下:
- 创建File对象dir,指定了目录名为"mydir"。
- 判断目录是否存在,如果不存在,则使用mkdir()方法创建目录。
- 判断目录是否存在,如果存在,则使用delete()方法删除目录。
总体来说,这段代码主要是为了测试目录创建和删除的功能,如果目录存在,则会删除目录,如果不存在,则会创建目录。
测试文件创建和删除
代码语言:java复制public static void testFile() throws Exception {
//测试文件创建
File file = new File("myfile.txt");
if(!file.exists()) {
file.createNewFile();
}
//测试文件删除
if(file.exists()) {
file.delete();
}
}
拓展:
如上代码定义了一个名为testFile的静态方法,它可能会抛出异常。方法中有以下几个步骤:
- 创建一个名为"myfile.txt"的File对象。
- 如果该文件不存在,则使用createNewFile()方法创建该文件。
- 如果该文件存在,则使用delete()方法删除该文件。
可以看出,该方法的主要作用是测试文件创建和删除的功能。如果文件创建和删除正常,代码将不会抛出异常。否则,如果文件创建失败或删除失败,将会抛出异常。
测试文件重命名
代码语言:java复制package com.example.javase.se.classes;
import java.io.File;
/**
* @Author ms
* @Date 2023-11-05 17:56
*/
public class FileTest {
public static void testRename() throws Exception {
File oldFile = new File("test.txt");
if (!oldFile.exists()) {
oldFile.createNewFile();
}
File newFile = new File("newTest.txt");
if (oldFile.exists() && !newFile.exists()) {
oldFile.renameTo(newFile);
}
}
public static void main(String[] args) throws Exception {
testRename();
}
}
测试结果
根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。
测试代码分析
根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
这是一个简单的文件操作示例,其中包括了文件的重命名操作。具体过程如下:
- 首先创建一个名为"test.txt"的文件对象 oldFile。
- 判断该文件对象是否存在,如果不存在,则通过调用 createNewFile() 方法创建一个新文件。
- 创建一个名为"newTest.txt"的新文件对象 newFile,同时判断 oldFile 是否存在且 newFile 不存在。如果成立,说明可以将 oldFile 重命名为 newFile。
- 调用 renameTo() 方法实现重命名操作。
- 在 main() 方法中调用 testRename() 方法即可执行文件重命名操作。
需要注意的是,这里的文件重命名操作是基于文件对象的,需要在同一个目录下操作。如果需要改变目录,可以先将原文件复制到新目录下,然后删除原文件。
全文小结
本文介绍了Java中的File类,包括其基本概念、应用场景、优缺点以及常用方法的说明。通过实际案例和源码分析,我们深入了解了File类的使用方法和内部实现机制。希望本文对初学者有所帮助。
总结
File类是Java文件和目录路径名的抽象表示,它提供了一系列的方法来操作文件和目录。在文件IO操作中,File类的使用非常广泛,对于大文件和目录的操作也具有较好的性能。但在多线程环境下的文件操作和对小文件的操作上,File类存在一些不足。
... ...
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!