1.File 类的基本方法
* String getAbsoluteFile(); // 返回该文件的绝对路径
* String getPath(); // 只返回 File 构造方法传入的路径
* String getName(); // 返回 File 构造方法后面一部分,文件/目录的名成
* Long length(); // 返回文件的大小,不能返回文件夹大小
2. File 类判断方法
* boolean exists(); // 该文件/目录是否存在
* boolean isDirectory(); // 是否是文件夹
* boolean isFile(); // 是否是文件
3. File 类创建删除功能的方法
* boolean createNewFile(); // 当且仅当具有该文件名的文件不存在时,创建新的空文件。
* delete(); // 删除由此File表示的文件或目录
* mkdir(); //创建由此File 表示的目录:
只能创建单级文件夹
* mkdirs(); // 创建由此File 表示的目录,包括任何必需但不存在的父目录:
既可以创建单级文件夹,也可以创建多级文件夹
4. File 类的遍历(只能遍历目录)
* String[] list(); // 表示该File目录中的所有 文件或目录的名称
* File[] listFiles(); // 表示该File目录中的所有 文件或目录 File对象
5.打印多级目录
public class FileDemo5 { public static void main(String[] args) { fun1(); } public static void fun1(){ File file = new File("E:\\Basics\\IO"); recursion(file,0); } public static void recursion(File file,int count){ if(file.exists() && file.isDirectory()){ File[] fileList = file.listFiles(); for(File f : fileList){ if(f.isDirectory()){ for(int i = 0 ; i < count ; i++){ System.out.print(" "); } System.out.println("文件夹名:" + f.getName()); recursion(f,count + 1); } else{for(int i = 0 ; i < count ; i++){ System.out.print(" "); } System.out.println("文件名:" + f.getName()); } } } else{ System.out.println("该目录不存在!!!"); } }
结果:
文件名:demo1.txt
文件名:demo2.txt
文件名:demo3.txt
文件夹名:dir1
文件夹名:dir11
文件夹名:dir111
文件名:dir111文本.txt
文件名:dir11.java
文件名:dir11文本.txt
文件名:dir12文本.txt
文件夹名:dir2
文件名:dir21.java
文件名:dir21文本.txt
5.1 如上,如果我只想得到这个目录下所有以 .java 结尾的文件呢?
可以在输出文件名之前进行判断:
else{ String fileName = f.getName(); if(fileName.endsWith(".java")){ for(int i = 0 ; i < count ; i++){ System.out.print(" "); } System.out.println("文件名:" + fileName); } }
结果:
文件夹名:dir1
文件夹名:dir11
文件夹名:dir111
文件名:dir11.java
文件夹名:dir2
文件名:dir21.java
文件夹名:newDir
文件夹名:newDir12
除了以上方法,我们可以使用 listFiles()方法的两个重载方法 listFiles(FileFileter filter)、listFiles(FilenameFilter filter)。使用到两种过滤器。
6.FileFilter过滤器、FilenameFilter 过滤器
FileFilter过滤器:一个接口,没有实现类。需要我们自己写实现类,并实现accept()方法。
使用 FileFilter 过滤器,是我们使用到 File 类的 listFiles(FileFilter fileFilter) 方法时。
FileFilter 实现类中 accept() 方法接收到,该目录下所有文件/文件夹,依次根据accept() 方法中定义的规则判断:符合,返回true; 不符合,返回false。而 dir.listFiles(FileFileter fileFilter)方法中接收到返回值:为true时,存入数组中,为false,不存入。
根据 上述需求,我们可以创建FileFilterImpl类:
FileFilter.java
package com.xiaojian.basics.io.file; import java.io.File; import java.io.FileFilter; /** * FileFilter 过滤器的实现类 */ public class FileFilterImpl implements FileFilter { @Override public boolean accept(File pathname) { if(pathname.isDirectory()){ return true; } return pathname.getName().endsWith(".java"); } }
或使用匿名内部类:
File[] fileList = file.listFiles(new FileFilter(){ @Override public boolean accept(File pathname) { return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"); } });
使用 lambda 表达式(接口中只有一个抽象方法)
File[] fileList = file.listFiles((pathname) -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));
FilenameFilter过滤器:大致相同
其中 FilenameFilter 接口的 accept(File dir,String name) 方法中的参数,dir:表示当前使用listFiles方法的File类;name:表示当前遍历的文件/目录。
使用匿名内部类
File[] fileList = file.listFiles(new FilenameFilter(){ @Override public boolean accept(File dir, String name) { return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java"); } });
使用 lambda表达式(接口中只有一个抽象方法)
File[] fileList = file.listFiles((dir,name) -> new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java"));