Day08 File类、递归、文件过滤器

Day 08File类、递归

一、File类

1.1 简介

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

1.2 构造方法

  • 用路径字符串构造public File(String name)

  • 用父路径字符串+子路径字符串构造public File(String parent,String child)

  • 用父抽象路径(目录实例)+子路径public File(File parent,String child)

    创建一个File实例时,对应一个硬盘上一个实际存在的文件或目录。但是不管给的路径上是否确实有文件/目录存在,都不会影响对象的创建

1.3 常用方法

  • getAbsolutePath()返回此File的绝对路径字符串

  • getPath()将此File转换为路径名字符串

  • getName() :返回由此File表示的文件或目录的名称。

  • p length() :返回由此File表示的文件的长度。

public class Day08 {

	public static void main(String[] args) throws IOException {
			File f = new File("a.txt");
			System.out.println(f.getAbsolutePath());
        	//C:\Users\wudan\eclipse-workspace\Jinjie\a.txt
			System.out.println(f.getPath());//构造路径 输出:a.txt
			System.out.println(f.getName());//a.txt
			System.out.println(f.length());//0(因为文件不存在)
        File f2 = new File("D:\\Matlab");
			System.out.println(f2.getAbsolutePath());//D:\Matlab
			System.out.println(f2.getPath());//D:\Matlab
			System.out.println(f2.getName());//Matlab
			System.out.println(f2.length());//20480
        //对于目录类
	}	
}	

绝对路径:从盘符开始计算的路径如D:\…。相对路径:从项目目录开始算起的路径,相对方便,如上述代码中a.txt用的就是相对路径。

几个常用的判断方法:

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

创建与删除功能:

  • public boolean creatNewFile()创建一个新的空文件,前提是该文件原本不存在
  • public boolean delete()删除由此File代表的文件或目录,删除目录的时候,只有目录下不存在文件或别的目录才能操作成功
  • public boolean mkdir()创建File代表的目录。
  • public boolean mkdirs()创建File代表的目录,包括任何必须但不存在的父目录
public static void main(String[] args) throws IOException {
			File f = new File("D:\\test\\text");
			File f2 = new File(f,"a.txt");		
			System.out.println(f.mkdir());
			System.out.println(f.mkdirs());
			System.out.println(f2.createNewFile());
			System.out.println("以上为创建测试");
			System.out.println(f.exists()+ " " +f2.exists());
			System.out.println(f.isFile()+" "+f.isDirectory());
			System.out.println(f2.isFile()+" "+f2.isDirectory());
			System.out.println("以上为判断存在测试");
			System.out.println(f.delete());
			System.out.println(f2.delete());
			System.out.println(f.delete());		
	}	
/*
false
true
true
以上为创建测试
true true
false true
true false
以上为判断存在测试
false
true
true
*/

1.4 遍历目录

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

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

public static void main(String[] args) throws IOException {			
			File f= new File("D:\\Matlab");
				String [] s = f.list();
				for(String string : s) {
					System.out.println(string);
				}			
				System.out.println("_______________________");			
				File[] files = f.listFiles();
				for(File file : files) {
					System.out.println(file.getAbsolutePath());
				}			
	}

二、 递归

2.1 递归的简介

递归指的是自己调用自己的情况,一般可以分为两种:

  • 方法A中又调用了方法A,自己直接调用自己

  • 方法A调用了B,方法B调用了C,C调用了A 即A间接调用了自己

    • 需要注意的是,递归一定要有限制条件能停止递归(不能死循环递归),否则不断地调用会导致栈n内存溢出,即使有限制,递归次数也不能过多

    • 在构造的时候,禁止递归
      在这里插入图片描述

2.2 递归求和与阶乘

求和:

public static void main(String[] args) throws IOException {			
		System.out.println(getSum(5));			
	}
	private static int getSum(int i) {
		if(i == 1) {
			return 1;
		}else {
			return i + getSum(i-1);
		}
	}

求阶乘:就是把retun i + getSum(i-1)改为 return i*getSum(i-1)

2.3 递归打印多级目录

public static void main(String[] args) throws IOException {			
				File f= new File("D:\\Matlab");
				getDirectiory(f);
	}
	private static void getDirectiory(File f) {
			File[] files = f.listFiles();
			for(File file : files) {
				if(file.isDirectory()) {
					System.out.println(f.getAbsolutePath());
					getDirectiory(file);
				}
				else {
					System.out.println(file.getAbsolutePath());
				}
			}	
	}

2.4 文件搜索

查询此目录下所有的txt文件,只需对2.3的代码中else部分作如下修改

else {
		if(file.getName().endsWith(".txt")){
					System.out.println(file.getName());}
				}

三、文件过滤器

3.1 文件过滤器优化

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

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

通过过滤器进行优化,筛选需要的文件,如果是目录则再进到目录里进行遍历过滤。

采用过滤器的方式,查找刚才的.txt文件

public static void main(String[] args) throws IOException {			
				File f= new File("D:\\Matlab");
				getDirectiory(f);
	}
	private static void getDirectiory(File f) {		
			File[] files = f.listFiles(new FileFilter() {
							@Override
				public boolean accept(File pathname) {
					// TODO Auto-generated method stub
					return pathname.getName().endsWith(".txt")||pathname.isDirectory();
				}
			});
			for(File file : files) {
				if(file.isDirectory()) {
					getDirectiory(file);
				}
				else {
					System.out.println(file.getAbsolutePath());
				}
			}	
	}

先筛选,再遍历,只要不是目录,就一定是.txt文件

3.2Lambda优化

由于接口中有且仅有一个accept函数,所以可以使用λ表达式,代替匿名内部类:

private static void getDirectiory(File f) {		
			File[] files = f.listFiles(pathname -> pathname.isDirectory()||pathname.getName().endsWith(".txt"));
			for(File file : files) {
				if(file.isDirectory()) {
					getDirectiory(file);
				}
				else {
					System.out.println(file.getAbsolutePath());
				}
			}	
	}
  • 仅有一个参数 (pathname) 可以去掉小括号
  • 只有一条语句块,可以省略return,语句分号,大括号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值