目录
2.File(String parent, String child):
3.File(File parent, String child):
一、前言:
1.人话:
大家好,今天分享一下关于File类的那些事儿,File类常用的构造方法和成员方法up都会一一进行代码演示。这篇文章以基础为主,适合0基础快速入门,或者初学者查缺补漏都可以,注意代码中的注释也很重要。我尽量以通俗易懂的方式分享给大家。所有文章都会适时补充,良工不示人以朴。感谢阅读!(PS: IDEA讲解,点击目录可以跳转。)
2.关于相对路径和绝对路径:
绝对路径: 指的是从顶层目录(windows下为盘)开始定位,形成的路径。
相对路径: 指的是从当前目录(IDEA默认从项目开始)开始定位,形成的路径。
如果是IDEA项目中的文件,你可以直接右键,选择Copy Path/Refrence... ,(当然如果你用中文的话,肯定能找到),演示如下:(之后讲到File类的获取方法时有具体的代码演示)
如上面gif所示,Absolute Path即使绝对路径,下面的Path From Content Root就是相对路径🌶。 PS:建议使用绝对路径。
3.关于java中 要打出右斜杠'\'的问题:
错误做法:
这是新手最容易犯的一个错误。因为File类操作路径,而路径分隔符不是左斜线就是右斜线,但在java中,右斜杠本身有转义符的意思,因此,直接输出右斜杠会直接报错,如下:
publicclassTest { publicstaticvoidmain(String[] args) { //这么输出直接报错!//System.out.println("👴头铁,就要这么干:" + \);//System.out.println("👴头铁,就要这么干2:" + "\");/*Error:头铁一号会报非法字符的错误头铁二号会报未结束的字符串的错误Reason:这是因为\是转义符,\" 相当于输出一个双引号,但因此你字符串就烂尾了。*/ } }
正确做法:
想打印出一条右斜杠,就要按下两次\\键,如下:
publicclassDemo { publicstaticvoidmain(String[] args) { //如何输出右斜杠?System.out.println("给👴输出右斜杠:"+"\\"); } }
为啥讲这个?
File类操作文件路径,而路径分隔符可以使用一条左斜线/ 或者两条右斜线\\ ,单独使用一条右斜线会报错。
二、概念(介绍):
File,即文件、文件夹,一个File对象表示了磁盘上的某个文件或文件夹。在java中,File类实质是以文件或者文件夹的路径来操作的。File 类是 java.io 包中唯一代表磁盘文件本身的对象。
File类以文件或文件夹为单位进行操作,因此不能直接访问文件的内容,若想访问文件内容,需要配合java中的IO流来完成。大家有兴趣也可以去看看我之前写得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类代码如下:
packageknowledge.iocurrent.file; importjava.io.File; importjava.io.IOException; publicclassFileConstructors { publicstaticvoidmain (String[] args) throwsIOException {//建议直接抛出父类异常//演示File类的三种构造方法:(1.txt之后会在创建功能的演示中创建)//1.File (String pathname):Filefile1=newFile("D:\\JAVA\\IDEA\\1.txt"); System.out.println("给👴看看file1对象长啥样:\n"+file1); System.out.println("---------------------------------"); //2.File(String parent, String child):Filefile2=newFile("D:/JAVA/IDEA/", "2.txt"); System.out.println("给👴看看file2对象长啥样:\n"+file2); System.out.println("---------------------------------"); //3.File(File parent, String child):Fileparent=newFile("D:/JAVA/IDEA"); Filefile3=newFile(parent, "3.txt"); System.out.println("给👴看看file3对象长啥样:\n"+file3); } }
输出结果:
可以看到,我们的File类型对象,其实就是磁盘文件的路径。
四、成员方法:
1.创建功能的方法:
①前言:
对于创建功能,如果合法路径对应的文件不存在,就创建,返回true;存在,就不创建,返回false。其实对于删除功能和判断功能都是如此,返回值为boolean类型。
②常见三种创建方式:
createNewFile() : 见名知意,就是创建一个新文件。(由路径创建File对象对应的文件)
mkdir(): 创建目录(即文件夹),但只能是单级目录。
mkdirs(): 创建目录(即文件夹),但既可以是单级目录,又可以是多级目录。
PS: mkdir其实就是make directory的缩写。
③代码演示:
我们仍然以刚才那个路径作演示,注意fileEX这个文件夹下是空的,如图:
我们先在file包下创建一个Create类作为演示类,如图:
Create类代码如下:
packageknowledge.iocurrent.file; importjava.io.File; importjava.io.IOException; publicclassCreate { publicstaticvoidmain(String[] args) throwsIOException{//建议直接抛出父类异常IOException//演示三种创建方式://1.createNewFile():/*注意1.txt这个文件是不存在的,但是我们可以通过file1.createNewFile()方法,创建file1对象对应的文件,即1.txt文件*/Filefile1=newFile("D:\\JAVA\\IDEA\\fileEX\\1.txt"); booleanbool1=file1.createNewFile(); booleanbool1ex=file1.createNewFile();//相同的文件对象只能成功创建一次。除非你删了它。System.out.println("创建1.txt文件成功了吗:"+bool1);//第一次创建成功,是true。System.out.println("文件已经存在,创建1.txt文件成功了吗:"+bool1ex);//第二次输出就是false了,因为已经存在。System.out.println(); //2.mkdir:Filefile2=newFile("D:\\JAVA\\IDEA\\fileEX\\1.txt但目录"); booleanbool2=file2.mkdir(); System.out.println("创建1.txt目录情况如何:"+bool2); System.out.println(); //3.mkdirs:Filefile3=newFile("D:\\JAVA\\IDEA\\fileEX\\我是目录\\a\\b"); booleanbool3=file3.mkdirs(); System.out.println("创建多级目录成功了没有:"+bool3); } }
输出结果及运行效果:
输出结果:
运行效果:
2.删除功能的方法:
①常用删除方法:
delete() : 删除当前对象指定的文件
注意也是以boolean类型作为接收。
②代码演示:
大家注意,方才我们用创建方法在D:\JAVA\IDEA\fileEX目录下创建了1.txt文本文件,如图:
现在我们试着用File类的删除功能来删掉1.txt这个文本文件。我们在file包下创建一个Delete类作为演示类,代码如下:
packageknowledge.iocurrent.file; importjava.io.File; //莫忘了导包importjava.io.IOException; publicclassDelete { publicstaticvoidmain(String[] args) throwsIOException{ //演示删除功能:Filefile1=newFile("D:\\JAVA\\IDEA\\fileEX\\1.txt"); booleanbool=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类代码如下:
packageknowledge.iocurrent.file; importjava.io.File; importjava.io.IOException; publicclassJudge { publicstaticvoidmain(String[] args) throwsIOException { //演示三种判断方法://1.isDirectory()://先来封装一个目录的file对象Filefile1=newFile("D:\\JAVA\\IDEA\\fileEX\\我是目录"); booleanbool1=file1.isDirectory(); System.out.println("file1对象对应的路径是不是目录:"+bool1); System.out.println("---------------------------------------------"); //2.isFile():booleanbool2=file1.isFile(); System.out.println("file1对象对应的路径是不是文件:"+bool2); System.out.println("---------------------------------------------"); //3.exists():Filefile2=newFile("D:\\JAVA\\IDEA\\fileEX\\1.txt"); //注意这时候这个文件还没有被创建booleanbool3=file2.exists(); booleanbool3ex=file2.isFile(); System.out.println("file2对应的1.txt这个文件现在存在吗:"+bool3); System.out.println("1.txt现在还没创建,那它是文件吗:"+bool3ex); System.out.println("---------------------------------------------"); file2.createNewFile(); booleanbool4=file2.exists(); booleanbool4ex=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的文件名
list(): 获取指定目录下所有文件(夹)的名称数组
listFiles(): 获取指定目录下所有文件(夹)的File类型数组
PS:1)绝对路径与相对路径的区别我们在前言已经说过了,这里不再赘述。
2)再强调一点,IDEA相对路径一般相对于当前项目路径开始。up还是建议使用绝对路径。
3)list()和listFiles()两个方法,主要区别是返回值类型不同,前者用String[] 作接收,后者用File[]作接收。
4)前三种获取方法均以String类型作接收。
②代码演示:
开始之前,先确认一下我们fileEX文件夹下有哪些文件,如图:
我们在file包下创建一个Obtain类作为演示类,如图:
Obtain类代码如下:
packageknowledge.iocurrent.file; importjava.io.File; importjava.io.IOException; importjava.util.Arrays; publicclassObtain { publicstaticvoidmain(String[] args) throwsIOException { //演示File类的五种常用获取方法://1.getAbsolutePath():获取file对象对应的绝对路径Filefile=newFile("D:/JAVA/IDEA/fileEX"); StringabsolutePath=file.getAbsolutePath(); System.out.println("输出file对象的绝对路径:"+absolutePath); /*Notice:①在进行创建File对象时,若使用的就是一个绝对路径创建的,则输出的相对路径与绝对路径是一样的。②只有创建的File对象是相对路径,输出的相对路径与绝对路径才会不同。因此我们这里输出的相对路径和绝对路径是一样的。*/System.out.println("================================="); //2.getPath(): 获取file对象对应的相对路径Stringpath=file.getPath(); System.out.println("输出file对象的相对路径:"+path); System.out.println("================================="); //3.getName(): 获取file的文件名StringfileName=file.getName(); System.out.println("输出file对象的文件名:"+fileName); System.out.println("================================="); //4.list(): 获取指定目录下所有文件(夹)的名称数组String[] fileNames=file.list(); /*获取到的名称数组我们使用增强for来遍历。之后的File数组同理。*/System.out.println("使用增强for遍历名称数组如下:"); for (StringfName : fileNames) { System.out.println(fName); } //此处也可以使用Arrays.toString() 方法来打印,如下:System.out.println(); System.out.println("我们再用一下Arrays.toString()方法试试:"); System.out.println(Arrays.toString(fileNames)); System.out.println("================================="); //5.listFiles(): 获取指定目录下所有文件(夹)的File类型数组File[] files=file.listFiles(); System.out.println("使用增强for遍历File数组如下:"); for (FilefilePlus : files) { System.out.println(filePlus); } System.out.println(); System.out.println("我们再用一下Arrays.toString()方法试试:"); System.out.println(Arrays.toString(files)); System.out.println("================================="); } } /*Notice:list方法仅仅能获取到指定文件夹下第一层的名称数组,也就是说,再内层的文件名称就获取不到了。*/
输出结果:
相对路径和绝对路径的具体展示:
因为我们一开始是以绝对路径创建的file对象,所以输出它的绝对路径和相对路径是一样的。只有当以相对路径来创建file对象时,输出的绝对路径和相对路径才不一样。而IDEA默认相对路径只能从项目名开始,因此,我们再以项目下的一个文件为例具体展示一下:
如图,我们以javapace/fileTest/1.txt文件夹为栗:
然后以一个PS类作演示:
代码:
packageknowledge.iocurrent.file; importjava.io.File; importjava.io.IOException; publicclassPs { publicstaticvoidmain(String[] args) throwsIOException { //copy一下1.txt的相对路径FilefilePS=newFile("javapace/fileTest/1.txt"); StringabsolutePath=filePS.getAbsolutePath(); Stringpath=filePS.getPath(); System.out.println("1.txt的绝对路径是:"+absolutePath); System.out.println("1.txt的相对路径是:"+path); } } /*总结:①在进行创建File对象时,若使用的就是一个绝对路径创建的,则输出的相对路径与绝对路径是一样的。②只有创建的File对象是相对路径,输出的相对路径与绝对路径才会不同。*/
输出结果:
🆗,这样就看出它们的区别了。
五、撒❀:
感谢你可以看到这里,觉得不错就给up点个赞吧。
System.out.println("END-----------------------------------------------------------------------------");