【File类、文件过滤器、递归】

mac2022-07-05  10

【File类、文件过滤器、递归】

File类

概述

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

1.2 构造方法

public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。

public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

构造举例,代码如下:

import java.io.File; /* * File 类的构造方法 * 三种重载形式 */ public class FileDemo1 { public static void main(String[] args) { function(); } /* * File(String pathname) * 传递路径名:可以写到文件夹,可以写到一个文件 * C:\\abc C:\\abc\\Demo.java * 将路径封装File类型对象 */ public static void function() { File file = new File("d:\\eclipse"); System.out.println(file); } /* * File(File parent,String child) * 传递路径,传递File类型父路径,字符串子路径 * 好处:父路径是File类型,父路径可以直接调用File类的方法 */ private static void function2() { File parent = new File("d:"); File file = new File(parent , "eclipse"); System.out.println(file); } /* * File(String parent,String child) * 传递路径,传递字符串父路径,字符串子路径 * 好处:单独操作父路径和子路径 */ public static void function_1() { File file = new File("d:","eclipse"); System.out.println(file); } }

小贴士:

一个File对象代表硬盘中实际存在的一个文件或者目录。无论该路径下是否存在文件或者目录,都不影响File对象的创建。

常用方法

获取功能的方法

public class FileDemo3 { public static void main(String[] args) { function_3(); } /* * File类的获取功能 * String getName(); * 返回路径中表示的文件或者文件夹名 * 获取路径中最后部分的名字 */ public static void function() { File file = new File("d:\\eclipse\\eclipse.exe"); String name = file.getName(); System.out.println(name); } /* * File类的获取功能 * String getParent() 返回String对象 * File getParentFile() 返回File对象 * 获取父路径 */ public static void function_3() { File file = new File("d:\\eclipse\\eclipse.exe"); File parent = file.getParentFile(); System.out.println(parent); } /* * File类获取功能 * String getAbsolutePath() 返回String对象 * File getAbsolutePath() 返回File对象 * 获取绝对路径 * */ public static void function2() { File file = new File("src");//写的是一个相对路径,获取的是绝对位置工程根目录 File absolute = file.getAbsoluteFile(); System.out.println(absolute); } /* * File 类获取功能 * long length() * 返回路径中表示的文件的字节数 */ public static void function1() { File file = new File("d:\\eclipse\\eclipse.exe"); long length = file.length(); System.out.println(length); } }

判断功能的方法

public boolean exists() :此File表示的文件或目录是否实际存在。public boolean isDirectory() :此File表示的是否为目录。public boolean isFile() :此File表示的是否为文件。

方法演示,代码如下:

/* * File类的判断功能 */ public class FileDemo4 { public static void main(String[] args) { function1(); } /* * File判断功能 * boolean isDirectory(); * 判断File构造方法中封装的路径是不是文件夹 * 如果是文件夹,返回true,不是文件返回false * * boolean isFile() * 判断File构造方法中封装的路径是不是文件 */ public static void function1() { File file = new File("d:\\eclipse"); if(file.exists()) { boolean b = file.isDirectory(); System.out.println(b); } } /* * File判断功能 * boolean exists() * 判断File构造方法中封装路径是否存在 * 存在返回true 不存在返回false */ public static void function() { File file = new File("d:\\eclipse\\eclipse.exe"); boolean b = file.exists(); System.out.println(b); } }

创建删除功能的方法

方法演示,代码如下:

import java.io.File; import java.io.IOException; /* * File类的创建和删除功能 * 文件或者目录 */ public class FileDemo2 { public static void main(String[] args) throws IOException { function2(); } /* * File创建文件的功能 * boolean createNewFile() * 创建文件路径和文件名,在File构造方法给出 * 文件已经存在了,不再创建 */ public static void function() throws IOException { File file = new File("d:\\a.txt"); boolean b = file.createNewFile(); System.out.println(b); } /* * File类的删除功能 * boolean delete() * 删除的文件或者是文件夹,在File类的构造方法中给出 * 删除成功返回true,删除失败返回false */ public static void function2() { File file = new File("d:\\a.txt"); boolean b = file.delete(); System.out.println(b); } /* * File创建文件夹功能 * boolean mkdirs() 创建多层文件夹 * 创建的路径也在File构造方法中给出 * 文件夹已经存在了,不再创建 */ public static void function1() { File file = new File("d:\\abc\\b\\c"); boolean b = file.mkdirs(); System.out.println(b); } }

API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。

目录的遍历

public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。

public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

import java.io.File; public class FileDemo { public static void main(String[] args) { function1(); } /* * File类的获取功能 * File[] listFiles() * 获取到,File构造方法中封装的路径中的文件和文件夹(遍历目录) * 返回的是目录或者文件的全路径 */ public static void function1() { File file = new File("d:"); File[] fileArr = file.listFiles(); for(File f : fileArr) { System.out.println(f); } } /* * File类的获取功能 * String[] list() * 获取到,File构造方法中封装的路径中的文件和文件夹(遍历目录) * 返回只有名字 */ public static void function() { File file = new File("d:"); String[] strArr = file.list(); System.out.println(strArr.length); for(String str : strArr) { System.out.println(str); } } }

小贴士:

调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

文件过滤器

java.io.FileFilter是一个接口,是File的过滤器。 该接口的对象可以传递给File类的listFiles(FileFilter) 作为参数, 接口中只有一个方法。

boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true。

分析:

接口作为参数,需要传递子类对象,重写其中方法。accept方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则: 要么是.java文件。要么是目录,用于继续遍历。 通过过滤器的作用,listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印。

代码实现:

import java.io.File; /* * File类的获取,文件获取过滤器 * 遍历目录的时候可以根据需要,只获取满足条件的文件 * 遍历目录方法 listFiles()重载形式 * listFiles(FileFilter filter)接口类型 * 传递FileFilter接口的实现类 * 自定义FileFilter接口实现类,重写抽象方法 * 接口实现类对象作为参数传递到遍历方法listFiles * */ public class FileDemo1 { public static void main(String[] args) { File file = new File("D:\\Demo"); File[] fileArr = file.listFiles(new MyFilter()); for(File f : fileArr) { System.out.println(f); } } } import java.io.File; import java.io.FileFilter; /* * 自定义过滤器 * 实现FileFilter接口,重写抽象方法 */ public class MyFilter implements FileFilter{ public boolean accept(File pathname) { /* * pathname 接受到的也是文件的全路径 * c:\\demo\\1.txt * 对路径进行判断,如果是java文件,返回true,不是java文件,返回false * 文件的后缀结尾是.java */ //String name = pathname.getName(); return pathname.getName().endsWith(".java"); } }

递归

概述

递归:指在当前方法内调用自己的这种现象。

递归的分类:

递归分为两种,直接递归和间接递归。直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

注意事项:

递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。构造方法,禁止递归 /* * 方法的递归调用 * 方法自己调用自己 * 适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化 * 注意: * 递归一定要有出口, 必须可以让程序停下 * 递归次数不能过多 * 构造方法,禁止递归 */ public class DiGuiDemo { public static void main(String[] args) { int sum = getSum(3); System.out.println(sum); System.out.println(getJieCheng(5)); System.out.println(getFBNQ(12)); } /* * 方法递归,计算斐波那契数列 * */ public static int getFBNQ(int month){ if( month == 1) return 1; if( month == 2) return 1; return getFBNQ(month-1)+getFBNQ(month-2); } /* * 计算阶乘 5! * 5*4*3*2*1 */ public static int getJieCheng(int n){ if ( n == 1) return 1; return n * getJieCheng(n-1); } /* * 计算 1+2+3+100和 = 5050 * 计算规律: * n+(n-1)+(n-2) * 100+(100-1)+(99-1)+...1 */ public static int getSum(int n){ if( n == 1) return 1; return n + getSum(n-1); } }

递归打印多级目录

代码实现:

import java.io.File; /* * 对一个目录目录下的所有内容,进行完整的遍历 * 编程技巧,方法的递归调用,调用自己 */ public class FileDemo { public static void main(String[] args) { File dir = new File("D:\\Demo"); getAllDir(dir); } /* * 定义方法,实现目录的全遍历 */ public static void getAllDir(File dir) { System.out.println(dir); //调用方法listFiles()对目录,dir进行遍历 File[] fileArr = dir.listFiles(); for(File f : fileArr) { //判断f表示的路径是不是文件夹 if(f.isDirectory()) { //是一个目录,就要去遍历这个目录 //本方法,getAllDir,就是给个目录去遍历 //继续调用getAllDir,传递其他目录 getAllDir(f); }else { System.out.println(f); } } } }

综合案例

文件搜索

搜索D:\Demo 目录中的.java 文件。 代码实现:

/* * 遍历目录,获取目录下的所有.java文件 * 遍历多级目录,方法递归实现 * 遍历的过程中,使用过滤器 */ import java.io.File; public class FileDemo1 { public static void main(String[] args) { File dir = new File("D:\\Demo"); getAllJava(dir); } /* * 定义方法,实现遍历指定目录 * 获取目录中所有.java文件 */ public static void getAllJava(File dir) { //调用File对象方法listFiles()获取,加入过滤器 File[] fileArr = dir.listFiles(new MyJavaFilter()); for(File f : fileArr) { //判断f表示的路径是不是文件夹 if(f.isDirectory()) { //递归进入文件夹遍历 getAllJava(f); } else { System.out.println(f); } } } } /* * 自定义过滤器 * 实现FileFilter接口,重写抽象方法 */ public class MyJavaFilter implements FileFilter{ @Override public boolean accept(File pathname) { //判断是目录,不需要比对后缀,直接返回true if(pathname.isDirectory()) { return true; }else { return pathname.getName().toLowerCase().endsWith(".java"); } } }

运行结果:

最新回复(0)