作者:孙玉昌,昵称【一一哥】,另外 【壹壹哥】 也是我哦
千锋教育高级教研员、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流来读写一个文件的内容,敬请关注哦。另外如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。