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

【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);
		
	}
	
}

小贴士:

  1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
  2. 无论该路径下是否存在文件或者目录,都不影响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。

分析

  1. 接口作为参数,需要传递子类对象,重写其中方法。
  2. accept方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:
    1. 要么是.java文件。
    2. 要么是目录,用于继续遍历。
  3. 通过过滤器的作用,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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值