package demoFile; import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; import java.io.IOException; /* java.io.file类是文件和目录路径名的抽象表示,主要用于文件和目录的新建、修改和删除。 静态构造方法: public(String pathname):通过给定的路径字符串转换为抽象路径来创建新的File实例 public(String parent,String child):从父路径字符串和子路径字符串创建File实例 public(File parent,String child):从抽象路径和子路径字符串创建新的File实例 2、File类的静态成员变量 static String pathSeparator:与系统有关的路径分隔符,他表示为一个字符串 static char pathSeparatorChar:与系统有关的路径分隔符 static String separator:与系统有关的默认名称分隔符,他表示为一个字符 static char separatorChar:与系统有关的默认名称分隔符。 */ public class Demo01File { static int countFile = 0, countDir = 0; public static void main(String[] args) { //文件或者路径可以是有效的,也可以是无效的 File file = new File("D:\JAVA学习\demo\英语单词.txt"); System.out.println(file.pathSeparator); //路径分隔符windows是分号;,linux是冒号: System.out.println(file.pathSeparatorChar); System.out.println(file.separator); //文件名称分隔符windows是反斜杠,linux是正斜杠/ System.out.println(file.separatorChar); getMethod(); createFile(); listFile(new File("D:\新天地")); System.out.println("文件个数:" + countFile); System.out.println("目录个数:" + countDir); System.out.println("----------其中:pdf文件有----------"); // listPdfFile(new File("D:\新天地")); // listPdfFileInnerClass(new File("D:\新天地")); // listPdfFileInnerClass2(new File("D:\新天地")); listPdfFileLambda(new File("D:\新天地")); } /* 获取方法 public String getAbsolutePath():返回此File的绝对路径名字符串。 public String getPath():将此File转换为路径名字符串。 public String getName():返回由此File表示的文件或目录名称。 public long length():返回由此File表示的文件的长度。 */ public static void getMethod() { // 如果File创建参数使用了绝对路径则getPath返回的也是绝对路径 File fl = new File("JAVA学习笔记_File类和IO流.docx"); System.out.println(fl.getAbsolutePath());//返回绝对路径 D:JAVA学习demoJAVA学习笔记_File类和IO流.docx System.out.println(fl.getPath());//返回相对路径 JAVA学习笔记_File类和IO流.docx System.out.println(fl.getName());//返回文件名 JAVA学习笔记_File类和IO流.docx System.out.println(fl.length()); //返回文件大小字节数,无文件返回0 } /* 判断方法 public Boolean exists():判断文件或目录是否存在 public Boolean isDirectory():判断是否为目录 public Boolean isFile():判断是否为文件 创建和删除方法 public Boolean createNewFile():仅当具有该名称的文件不存在时,创建一个新的空文件 public Boolean delete():删除由此File表示的目录或文件 public Boolean mkdir():创建有此File表示的文件目录 public Boolean mkdirs():创建有此File表示的目录,包括任何必需不存在的父目录 */ public static void createFile() { String path = (new File("")).getAbsolutePath(); File f = new File(path, "myDir"); if (!f.exists()) { f.mkdirs(); } else { System.out.println("目录已存在。"); } f = new File(f, "我爱你中国.txt"); try { f.createNewFile(); } catch (IOException e) { System.out.println(e); } f.delete(); } /* File类的遍历方法 public String[] list() 返回一个String数组,表示该File类中所有的子文件和目录 public File[] listFiles() 返回一个File数组,表示该File类中所有的子文件和目录 */ //使用递归罗列目录中存在的所有子目录和文件 public static void listFile(File f) { System.out.println(f); File[] lf = f.listFiles(); for (File file : lf) { if (file.isDirectory()) { countDir++; listFile(file); } else { System.out.println(file); countFile++; } } } //通过过滤器仅返回目录和pdf文档 public static void listPdfFile(File dir) { File[] fl = dir.listFiles(new Demo03FileFilterImpl()); for (File file : fl) { if (file.isDirectory()) { listPdfFile(file); } else { System.out.println(file); } } } //使用匿名内部类:通过过滤器仅返回目录和pdf文档 public static void listPdfFileInnerClass(File dir) { File[] fl = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory() || pathname.toString().toLowerCase().endsWith(".pdf"); } }); for (File file : fl) { if (file.isDirectory()) { listPdfFile(file); } else { System.out.println(file); } } } //使用匿名内部类:文件过滤器的另一个接口类型FilenameFilter public static void listPdfFileInnerClass2(File dir) { File[] fl = dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { // 参数:dir为遍历的源目录,name为里面的子目录和文件 return new File(dir, name).isDirectory() || name.toString().toLowerCase().endsWith(".pdf"); } }); for (File file : fl) { if (file.isDirectory()) { listPdfFile(file); } else { System.out.println(file); } } } //使用lambda表达式(匿名内部类优化写法):通过过滤器仅返回目录和pdf文档 public static void listPdfFileLambda(File dir) { //匿名内部类接口只有一个抽象方法的时候,就可以使用lambda表达式来简化 File[] fl = dir.listFiles((File pathname) -> { return pathname.isDirectory() || pathname.toString().toLowerCase().endsWith(".pdf"); }); for (File file : fl) { if (file.isDirectory()) { listPdfFile(file); } else { System.out.println(file); } } } }
-------FileFilter接口实现类------
package demoFile; import java.io.File; import java.io.FileFilter; /* 文件过滤器:在File类中有两个重载了listFiles的方法,方法参数传递就是过滤器 java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。 作用:用来过滤文件(File对象) 抽象方法:boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。 java.io.FilenameFilter接口:实现此接口的实现类可以用于过滤文件名。 作用:用于过虑文件名 抽象方法:boolean accept(File dir,String name)测试指定文件是否应该包含在某一文件列表中。 注意:两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义顾虑的规则。 */ public class Demo03FileFilterImpl implements FileFilter { /* * 过滤规则:如果文件是以.pdf结尾的就返回true,否则返回false * 如果传入的是一个文件夹,也要返回true保证调用函数可以继续遍历 * */ @Override public boolean accept(File pathname) { if (pathname.isDirectory()){ return true; } return pathname.toString().toLowerCase().endsWith(".pdf"); } }