File类是文件和目录 路径名的表示,主要用于文件和目录的创建、查找和删除等操作。
文件(File): Xxx.txt, Xxx.java, Xxx.avi
目录(Directory): 文件夹
文件路径 文件夹路径
FIle可以表示文件或文件夹的路径, 但是这个路径可能存在, 也可能不存在
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。 public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
绝对路径 : 从盘符开始, 一直表示到最后的文件或者文件夹
相对路径 : 相对于某一个文件夹开始, 后面的路径
这里来举两个例子来进行说明:
demo1:
File fileOne = new File("C:\\Users\\liguang\\Desktop\\filetest\\one");
one是一个文件夹,那么fileOne代表的就是windows操作系统下的一个文件夹,我们可以来操作这个文件夹下面的文件和文件夹。
demo2:
File file = new File(fileOne,"a.txt");
在上面的文件夹基础之上,建立一个名叫a.txt的文件,那么file代表的就是名叫a.txt的文件
demo3:
File file = new File("C:\\Users\\liguang\\Desktop\\filetest\\one","lalal.txt");
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 //file.createNewFile() public boolean mkdir():创建由此File表示的目录。/单级文件夹,返回是否创建成功 public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。// 多级: 创建前面必须但不存在的文件夹
举例说明:
File file = new File("C:\\Users\\liguang\\Desktop\\filetest\\one","lalal.txt"); System.out.println("文件的绝对路径是:"+file.getAbsolutePath()); if (!file.exists()){ try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("文件的大小是:"+file.length());
判断是否存在这个文件,如果存在,那么直接输出对应的文件大小即可。如果不存在,那么创建文件并输出。
File newFile = new File(fileOne,"hello/world/a"); if (!newFile.exists()){ // newFile.mkdir(); newFile.mkdirs(); }
使用mkdir这个方法,无法创建出来对应的文件夹,因为这里有多层,而不是单层;
使用mkdirs这个方法,不管是单层文件夹还是多层文件夹,都可以创建成功。
public boolean delete() :删除由此File表示的文件或目录。//file.delete()) 特点: 1. 删除的内容不走回收站 2. 只能删除空文件件
demo:
File newFile = new File(fileOne,"hello/world/a"); if (!newFile.exists()){ newFile.mkdirs(); } newFile.delete();
在进行删除的时候可以发现,删除的只有一层,也就是说只把a的给删除掉了,因为newFile代表的就只是a这个文件夹,而不是hello/world/a这一整个目录。
public String getAbsolutePath() :返回此File的绝对路径名字符串。 public String getPath() :将此File转换为路径名字符串。 获取构造方法中的路径 public String getName() :返回由此File表示的文件或目录的名称。 public long length() :返回由此File表示的文件的长度。 (字节个数)不能获取文件夹的长度,
对应的demo如下所示:
public static void main(String[] args) { File fileOne = new File("C:\\Users\\liguang\\Desktop\\filetest\\one"); // 三个判断方法 if (fileOne.isDirectory()){ System.out.println("这个是文件夹"); } if (fileOne.isFile()){ System.out.println("这个是文件夹"); } if (fileOne.exists()){ System.out.println("当前文件所表示的文件或者是文件夹是否存在?"+fileOne.exists()); } System.out.println("获取方法"); System.out.println("-----------------------------------------------------------"); // 获取得到路径是一样的效果 String absolutePath = fileOne.getAbsolutePath(); System.out.println("当前文件的绝对路径是:"+absolutePath); String path = fileOne.getPath(); System.out.println("当前文件的路径是:"+path); String name = fileOne.getName(); System.out.println("获取得到文件的名称或者是文件夹的文字是:"+name); // 获取得到文件的大小,不能够表示文件夹的大小 long length = fileOne.length(); System.out.println("文件夹的大小是:"+length); // 创建一个文件a.txt File file = new File(fileOne,"a.txt"); long length1 = file.length(); System.out.println("a.txt文件的大小是:"+length1); System.out.println("获取得到a.txt的绝对路径是:"+file.getAbsolutePath()); }
public boolean exists() :此File表示的文件或目录是否实际存在。//file.exists() public boolean isDirectory() :此File表示的是否为目录。//同上 public boolean isFile() :此File表示的是否为文件。//同上
具体的demo可以参考上面的案例。
获取当前文件夹下(一层)中, 所有的文件和文件夹
String[] list() : 获取该文件夹下所有文件和文件夹的名字 File[] listFiles() : 获取该文件夹下所有文件和文件夹(以File的形式获取) File[] listFiles(FileFilter) :当前文件夹中的所有文件和文件夹, 都会作为参数执行FileFilter中的accept方法, 如果返回true, 文件就存入File数组中; 如果返回false, 文件就不存了
对应的代码所示:
public static void main(String[] args) { File file = new File("C:\\Users\\liguang\\Desktop\\filetest\\one"); // 列举出来文件夹下面的所有的文件和文件夹(如果是文件夹,里面还有文件,那么只会列举出来文件夹的名称) String[] list = file.list(); for (String s : list) { System.out.println("文件或者是文件夹的名称是:"+s); } System.out.println("--------------------"); File[] files = file.listFiles(); for (File file1 : files) { if (file1.isFile()){ System.out.println("文件名称是:"+file1.getName()); } } System.out.println("----------------------"); File[] listFilesFilter = file.listFiles(t -> t.isFile() & t.getName().endsWith("a.txt")); for (File file1 : listFilesFilter) { System.out.println(file1.getName()); } }
public class FileDemoThree { public static void main(String[] args) { File file = new File("C:\\Users\\liguang\\Desktop\\filetest\\one"); printFileName(file); } /** * 递归输出文件名称 */ private static void printFileName(File file){ if (Objects.nonNull(file)){ File[] listFiles = file.listFiles(); for (File listFile : listFiles) { if (listFile.isFile()){ System.out.println("对应的文件名称是:"+listFile.getName()); }else { printFileName(listFile); } } } } }
在递归期间的注意事项:
1. 递归必须要有出口 2. 就算有出口, 调用的次数不能过多