java.io.File类是文件和目录路径名的抽象表示。主要用于文件和目录的创建、查找、删除等操作。
-
创建一个文件、文件夹
-
删除一个文件、文件夹
-
获取一个文件、文件夹
-
判断文件、文件夹是否存在
-
对文件夹进行遍历
-
获取文件的大小
构造方法
-
public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新
File
实例。 -
public File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新
File
实例。 -
public File(File parent,String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新
File
实例。
获取功能的方法
-
public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。
-
public String getPath():将此File转换为路径名字符串
-
public String getName():返回由此File表示的文件或目录的名称。
-
public long length():返回此File表示的文件的长度。
判断功能的方法
-
public boolean exists():判断File表示的文件或者文件夹是否实际存在
-
public boolean isDirectory():判断此File表示的文件夹是否存在
-
public boolean isFile():判断此File表示的文件是否存在
-
public boolean createNewFile():当且仅当具有该名称的文件不存在时,创建一个新的空的文件,返回值是true
-
public boolean delete():删除由此File表示的文件或者目录
-
public boolean mkdir():创建由此File表示的文件夹
-
public boolean mkdirs():创建由此File表示的文件夹,包括任何必须但是又不存在的父目录。
目录的遍历
-
public String[] list():返回一个String数组,表示该File目录中的所有的子目录或者子文件。
-
public File[] listFile():返回一个File数组,表示该File目录中的所有的子目录或者子文件。
-
-
递归分为两类:直接递归和间接递归
-
直接递归:称为方法自身调用自己的情况
-
间接递归:可以归结为:方法A调用了方法B,方法B调用了方法C,方法C反过来又调用了方法A。
-
-
注意事项:
-
递归一定要有边界条件 (条件限定),保证递归能够停止下来,否则会发生栈内存溢出。
-
在递归当中虽然有限定条件,但是递归的次数也不能太多,否则也会发生栈内存溢出现象。
-
-
使用递归打印多级目录
public static void main(String[] args) { // 找到Hello文件的路径 File file = new File("C:\Users\admin\Desktop\Hello"); //调用getAllFiles() getAllFiles(file); } /* 定义一个方法,参数传递File类型的目录 方法中要对目录进行遍历 */ public static void getAllFiles(File file) { // 表明file此时是一个目录 System.out.println(file); //首先先获取到它直接子目录和直接子文件 File[] files = file.listFiles(); // 遍历files目录 for (File f : files) { // 判断如果得到的f是一个目录,需要再次遍历 if (f.isDirectory()) { // 表明f是一个目录,则继续遍历这个目录 //getAllFiles方法就是获取所有的文件,参数传递的刚好是目录。所以直接调用getAllFiles:递归(自己调用自己) getAllFiles(f); } else { // 此时f不是一个目录,肯定是一个文件 System.out.println(f); } } }
搜索:C:UsersadminDesktopHello目录中的所有的.txt文件
public static void main(String[] args) { //构建一个File对象得到C:UsersadminDesktopHello路径 File file = new File("C:\Users\admin\Desktop\Hello"); getAllTxt(file); } /* 定义一个方法,遍历所有的.txt文件 方法中依然需要传参数目录 */ public static void getAllTxt(File dir) { //System.out.println(dir); File[] files = dir.listFiles(); //遍历files for (File f : files) { // 判断f是否是一个目录 if (f.isDirectory()) { getAllTxt(f); } else { // 先获取文件的名称 /* String name = f.getName(); //String path = f.getPath(); // 大写字符串转换成小写 name = name.toLowerCase(); // 再次判断名称是否以.txt结尾 if (name.endsWith(".txt")) { System.out.println(f); }*/ // 链式编程 if (f.getName().toLowerCase().endsWith(".txt")) { System.out.println(f); } } } }
文件过滤器优化
java.io.FileFilter是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,接口当中只有一个方法:
public static void main(String[] args) { //构建一个File对象得到C:UsersadminDesktopHello路径 File file = new File("C:\Users\admin\Desktop\Hello"); getAllTxt(file); } /* 定义一个方法,遍历所有的.txt文件 方法中依然需要传参数目录 */ public static void getAllTxt(File dir) { //System.out.println(dir); //File[] files = dir.listFiles(); File[] files = dir.listFiles(new FileFilterImpl()); //遍历files for (File f : files) { // 判断f是否是一个目录 if (f.isDirectory()) { getAllTxt(f); } else { // 先获取文件的名称 System.out.println(f); } } } // 实现类中的代码 @Override public boolean accept(File pathname) { if (pathname.isDirectory()) { return true; } return pathname.getName() .toLowerCase() .endsWith(".txt"); }//Lambda优化 //FilenameFilter接口 File[] files = dir.listFiles((d,name) -> new File(d,name).isDirectory() || name.toLowerCase().endsWith(".txt")); //FileFilter接口 File[] files = dir.listFiles(pathname ->pathname.getName().toLowerCase().endsWith(".txt") || pathname.isDirectory());