目录
2.File(String parent, String child):
3.File(File parent, String child):
一、前言:
1.人话:
大家好,今天分享一下关于File类的那些事儿,File类
常用的构造方法和成员方法up都会一一进行代码演示
。这篇文章以基础为主,
适合0基础快速入门,或者初学者查缺补漏
都可以,注意代码中的
注释也很重要
。up会尽量以通俗易懂的方式将内容分享给大家。所有文章都会适时补充,良工不示人以朴。
感谢阅读!
(
PS: IDEA讲解,点击目录可以跳转。
)
2.关于相对路径和绝对路径:
绝对路径:
指的是
从顶层目录
(windows下为盘)
开始
定位,形成的路径。
相对路径:
指的是
从当前目录
(IDEA默认从项目开始)
开始
定位,形成的路径。
如果是IDEA项目中的文件,你可以直接右键,选择
Copy Path/Refrence…
,(当然如果你用中文的话,肯定能找到),演示如下:(
之后讲到File类的获取方法时有具体的代码演示)
如上面GIF图所示,
Absolute Path即绝对路径
,下面的
Path From Content Root就是相对路径
🌶。
PS:建议使用绝对路径。
3.关于java中 要打出右斜杠’\’的问题:
错误做法:
这是新手最容易犯的一个错误。因为File类操作路径,而路径分隔符不是左斜线就是右斜线,但
在java中,右斜杠本身有转义符的意思
,因此,直接输出右斜杠会直接报错,如下:
public class Test {
public static void main(String[] args) {
//这么输出直接报错!
//System.out.println("👴头铁,就要这么干:" + \);
//System.out.println("👴头铁,就要这么干2:" + "\");
/*
Error:
头铁一号会报非法字符的错误
头铁二号会报未结束的字符串的错误
Reason:
这是因为\是转义符,\" 相当于输出一个双引号,
但因此你字符串就烂尾了。
*/
}
}
正确做法:
想打印出一条右斜杠,需要连续输入两个\\键
,如下:
public class Demo {
public static void main(String[] args) {
//如何输出右斜杠?
System.out.println("给👴输出右斜杠:" + "\\");
}
}
为啥讲这个?
File类会操作文件路径,而
文件路径的路径分隔符可以使用一条左斜线/ 或者两条右斜线\\ ,单独使用一条右斜线会报错
。
二、概念(介绍):
File,即文件、文件夹,一个
File对象表示
了磁盘上的某个
文件
或
文件夹
。
在java中,File类实质是以文件或者文件夹的
路径
来操作的
。
File 类是 java.io 包中唯一代表磁盘文件本身的对象
。File类的类图如下 :
File类实现了Serializable和Comparable两个接口。当然,学过API常用工具专题——集合篇章后,这就是老面孔了。我们再来回顾一下——
Serializable接口的实现,使File类的对象可以串行化,串行化后,对象可以进行网络传输,也可以保存到文件。而Comparable接口的实现使得File对象可以进行比较
。
File类
以文件或文件夹为单位
进行操作
,因此
不能直接访问文件的内容
,若想访问文件内容,需要配合java中的IO流来完成。大家有兴趣也可以去看看up之前写得IO流基础的万字详解。
三、构造方法:
1.File (String pathname):
需要传入文件路径的String类型。
需要用File类型作接收。
2.File(String parent, String child):
和第一种构造方式大同小异。不过是将文件路径劈开了,分为父路径和子路径两部分,分开传上去。
3.File(File parent, String child):
与前两种构造方式略有差异
:将文件路径劈开后,又
先将父路径封装成了File类型
,然后再分别将File类型的父路径和String类型的子路径传上去。
4.
代码演示
:
我们以D:\JAVA\IDEA下的fileEX作为演示,注意这是个空文件夹,如图:
我们先在file包下创建一个FileConstructors类作为演示类,如图:
FileConstructors类
代码如下:
package knowledge.iocurrent.file;
import java.io.File;
import java.io.IOException;
public class FileConstructors {
public static void main (String[] args) throws IOException {//建议直接抛出父类异常
//演示File类的三种构造方法:(1.txt之后会在创建功能的演示中创建)
//1.File (String pathname):
File file1 = new File("D:\\JAVA\\IDEA\\1.txt");
System.out.println("给👴看看file1对象长啥样:\n" + file1);
System.out.println("---------------------------------");
//2.File(String parent, String child):
File file2 = new File("D:/JAVA/IDEA/", "2.txt");
System.out.println("给👴看看file2对象长啥样:\n" + file2);
System.out.println("---------------------------------");
//3.File(File parent, String child):
File parent = new File("D:/JAVA/IDEA");
File file3 = new File(parent, "3.txt");
System.out.println("给👴看看file3对象长啥样:\n" + file3);
}
}
输出结果 :
可以看到,我们的
File类型对象,其实就是磁盘文件的
路径
。
四、成员方法:
1.创建功能的方法:
①前言:
对于创建功能,如果合法路径对应的文件不存在,就创建该文件并返回true;如果该文件已经存在,就不创建,返回false
。
其实对于删除功能和判断功能的方法,返回值类型也为boolean类型。
②常见三种创建方式:
createNewFile() :
见名知意,就是
创建一个新文件
。(由路径创建File对象对应的文件)
mkdir():
创建目录(即文件夹),但
只能是单级目录
。
mkdirs():
创建目录(即文件夹),但
既可以是单级目录,又可以是多级目录
。
PS :
1°
mkdir其实就是make directory
的缩写。
2°
当我们创建一个File类对象时,仅仅是在内存中有了一个File对象,还未与磁盘发生实际的联系,只有当我们通过createNewFile()方法成功创建文件后,磁盘的相应位置才会创建实际存在着的文件。
③
代码演示
:
我们仍然以刚才那个路径作演示,注意fileEX这个文件夹下是空的,如图:
我们先在file包下创建一个Create类作为演示类,如图:
Create类
代码如下:
package knowledge.iocurrent.file;
import java.io.File;
import java.io.IOException;
public class Create {
public static void main(String[] args) throws IOException{//建议直接抛出父类异常IOException
//演示三种创建方式:
//1.createNewFile():
/*
注意1.txt这个文件是不存在的,但是我们可以通过file1.createNewFile()方法,
创建file1对象对应的文件,即1.txt文件
*/
File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
boolean bool1 = file1.createNewFile();
boolean bool1ex = file1.createNewFile();//相同的文件对象只能成功创建一次。除非你删了它。
System.out.println("创建1.txt文件成功了吗:" + bool1);//第一次创建成功,是true。
System.out.println("文件已经存在,创建1.txt文件成功了吗:" + bool1ex);//第二次输出就是false了,因为已经存在。
System.out.println();
//2.mkdir:
File file2 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt但目录");
boolean bool2 = file2.mkdir();
System.out.println("创建1.txt目录情况如何:" + bool2);
System.out.println();
//3.mkdirs:
File file3 = new File("D:\\JAVA\\IDEA\\fileEX\\我是目录\\a\\b");
boolean bool3 = file3.mkdirs();
System.out.println("创建多级目录成功了没有:" + bool3);
}
}
输出结果及运行效果——
输出结果:
运行效果:
2.删除功能的方法:
①常用删除方法:
delete() :
删除当前对象指定的文件(只能删除文件和空文件夹)
PS :
注意也是以boolean类型作为接收
。
②代码演示:
大家注意,方才我们用创建方法在D:\JAVA\IDEA\fileEX目录下创建了1.txt文本文件,如图:
现在我们试着
用File类的删除功能来删掉1.txt这个文本文件
。我们在file包下创建一个Delete类作为演示类,
代码如下:
package knowledge.iocurrent.file;
import java.io.File; //莫忘了导包
import java.io.IOException;
public class Delete {
public static void main(String[] args) throws IOException{
//演示删除功能:
File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
boolean bool = file1.delete();
System.out.println("1.txt到底删掉了没有:" + bool);
}
}
输出结果及运行效果——
输出结果:
运行效果:
🆗,1.txt壮烈牺牲。(bushi)
3.判断功能的方法:
①常用三种判断方法:
isDirectory():
判断
file对象对应的路径
是否为目录
isFile():
判断
file对象对应的路径
是否为文件
exists():
判断
file对象对应的路径
是否存在
②代码演示:
我们还是在D:\JAVA\IDEA\fileEX目录下作演示,因为刚才唯一的1.txt文本文件在演示删除功能时删掉了,所以我们可以
先对这个不存在的路径做一个判断,再用file对象重新创建一个1.txt文本文件,然后再对它进行判断
。结果不言而喻:第一次判断不存在,第二次存在。
我们在file包下创建一个Judge类作为演示类,如图:
Judge类
代码如下:
package knowledge.iocurrent.file;
import java.io.File;
import java.io.IOException;
public class Judge {
public static void main(String[] args) throws IOException {
//演示三种判断方法:
//1.isDirectory():
//先来封装一个目录的file对象
File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\我是目录");
boolean bool1 = file1.isDirectory();
System.out.println("file1对象对应的路径是不是目录:" + bool1);
System.out.println("---------------------------------------------");
//2.isFile():
boolean bool2 = file1.isFile();
System.out.println("file1对象对应的路径是不是文件:" + bool2);
System.out.println("---------------------------------------------");
//3.exists():
File file2 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
//注意这时候这个文件还没有被创建
boolean bool3 = file2.exists();
boolean bool3ex = file2.isFile();
System.out.println("file2对应的1.txt这个文件现在存在吗:" + bool3);
System.out.println("1.txt现在还没创建,那它是文件吗:" + bool3ex);
System.out.println("---------------------------------------------");
file2.createNewFile();
boolean bool4 = file2.exists();
boolean bool4ex = file2.isFile();
System.out.println("已经创建的1.txt这个文件现在存在了吗:" + bool4);
System.out.println("已经创建的1.txt是文件吗:" + bool4ex);
}
}
/*
Summary:
文件只有在被创建后,才能被判断为是文件!
*/
输出结果及运行效果——
输出结果:
从输出结果来看,假如1.txt文件没有创建时,判断它是不是文件,结果居然是false,当然创建后,它既存在,也是文件。因此我们发现:
The file can be judged as file only when it has been created.
即
文件只有在被创建后才能被判断为是文件
。
运行效果:
4.获取功能的方法:
①常见七种获取方法:
getAbsolutePath():
获取
file对象对应的
绝对路径
getPath():
获取
file对象对应的
相对路径
getName():
获取
file的
文件名
getParent():
获取
file的
父级目录
length():
获取
file的
当前大小(以字节计算,以long类型做接收)
list():
获取
指定目录下所有文件(夹)的
名称数组
listFiles():
获取
指定目录下所有文件(夹)的
File类型数组
PS:
1)绝对路径与相对路径的区别我们在前言已经说过了,这里不再赘述。
2)再强调一点,IDEA相对路径一般相对于当前项目路径开始。up还是建议使用绝对路径。
3)list()和listFiles()两个方法,主要区别是返回值类型不同,前者用String[] 作接收,后者用File[]作接收。
4)前四种获取方法均以String类型作接收。
②代码演示:
开始之前,先确认一下我们fileEX文件夹下有哪些文件,如图:
我们在file包下创建一个Obtain类作为演示类,如图:
Obtain类
代码如下:
package csdn.knowledge.api_tools.iocurrent.file;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class Obtain {
public static void main(String[] args) throws IOException {
//演示File类的五种常用获取方法:
//1.getAbsolutePath():获取file对象对应的绝对路径
File file = new File("D:\\JAVA\\IDEA\\fileEX\\");
String absolutePath = file.getAbsolutePath();
System.out.println("输出file对象的绝对路径:" + absolutePath);
/*
Notice:
①因为up这里在创建File对象时,使用的是绝对路径,
所以我们这里输出的相对路径和绝对路径是一样的。
②只有创建的File对象是相对路径,输出的相对路径与绝对路径才会不同。
*/
System.out.println("=================================");
//2.getPath(): 获取file对象对应的相对路径
String path = file.getPath();
System.out.println("输出file对象的相对路径:" + path);
System.out.println("=================================");
//3.getName(): 获取file的文件名
String fileName = file.getName();
System.out.println("输出file对象的文件名:" + fileName);
System.out.println("=================================");
//4.getName(): 获取file的文件名
String parentName = file.getParent();
System.out.println("输出file对象的父级目录:" + parentName);
System.out.println("=================================");
//5.length(): 获取file文件的大小(以字节为单位进行计算)
File file1 = new File("D:\\JAVA\\IDEA\\fileEX\\1.txt");
long size = file1.length();
System.out.println("file1文件的大小 = " + size + " byte");
System.out.println("=================================");
//6.list(): 获取指定目录下所有文件(夹)的名称数组
String[] fileNames = file.list();
/*
获取到的名称数组我们使用增强for来遍历。
之后的File数组同理。
*/
System.out.println("使用增强for遍历名称数组如下:");
for (String fName : fileNames) {
System.out.println(fName);
}
//此处也可以使用Arrays.toString() 方法来打印,如下:
System.out.println();
System.out.println("我们再用一下Arrays.toString()方法试试:");
System.out.println(Arrays.toString(fileNames));
System.out.println("=================================");
//7.listFiles(): 获取指定目录下所有文件(夹)的File类型数组
File[] files = file.listFiles();
System.out.println("使用增强for遍历File数组如下:");
for (File filePlus : files) {
System.out.println(filePlus);
}
System.out.println();
System.out.println("我们再用一下Arrays.toString()方法试试:");
System.out.println(Arrays.toString(files));
System.out.println("=================================");
}
}
运行结果 :
相对路径和绝对路径的具体展示:
因为我们一开始是以绝对路径创建的file对象,所以输出它的绝对路径和相对路径是一样的。只有当以相对路径来创建file对象时,输出的绝对路径和相对路径才不一样。而IDEA默认相对路径只能从项目名开始,因此,我们再以项目下的一个文件为例具体展示一下:
如图,我们以javapace/fileTest/1.txt文件夹为栗:
然后以一个PS类作演示:
代码:
package knowledge.iocurrent.file;
import java.io.File;
import java.io.IOException;
public class Ps {
public static void main(String[] args) throws IOException {
//copy一下1.txt的相对路径
File filePS = new File("javapace/fileTest/1.txt");
String absolutePath = filePS.getAbsolutePath();
String path = filePS.getPath();
System.out.println("1.txt的绝对路径是:" + absolutePath);
System.out.println("1.txt的相对路径是:" + path);
}
}
/*
总结:
①在进行创建File对象时,若使用的就是一个绝对路径创建的,
则输出的相对路径与绝对路径是一样的。
②只有创建的File对象是相对路径,输出的相对路径与绝对路径才会不同。
*/
输出结果:
🆗,这样就看出它们的区别了。
五、完结撒❀:
🆗,以上就是我们File类的全部内容了。File类其实算作讲解IO流的第一步铺垫,再往后是异常类,最后就是API常用工具专题——IO流篇章。当然,File类本身没太大难度,能够熟练使用它的一些方法即可。
感谢阅读!
System.out.println(“END—————————————————————————–“);