一.file一些方法的应用

1.删除方法delete 删除文件夹时 文件夹内不能有东西(必须为空) 文件可以直接删

那么如何删除由内容的文件夹呢?

public static void deleteFile(File file) {
	File[] listFiles = file.listFiles();
	for (File file2 : listFiles) {
		if (file2.isFile()) {
			file2.delete();
		}else {
			File[] listFiles2 = file2.listFiles();
			deleteFile(file2);
		}
	}
	file.delete();
}

2.获取文件的长度

获取的是文件的字节数 返回的是long型的返回值

File file1 = new File("/Users/Commander/Desktop/test/haha.txt");
//Mac下 一个英文字符一个字节 中文字符三个字节
long num = file1.length();

exercise:

计算文件夹的大小(包括内部文件的大小)

public static long getDirLength(File file) {
	long sum = 0;
	File[] listFiles = file.listFiles();
	for (File file2 : listFiles) {
		if (file2.isDirectory()) {
			File[] listFiles2 = file2.listFiles();
			getDirLength(file2);
			sum = sum + getDirLength(file2);
		}else {
			sum = sum + file2.length();
		}
	}
	return sum;
}

2.判断是不是文件夹 如果是就直接返回出来

public static File isDir() {		
	while (true) {
	        System.out.println("请输入一个文件夹路径");
	        Scanner scanner = new Scanner(System.in);
	        String string = scanner.nextLine();
	        File file = new File(string);
	        if (!file.exists()) {
		        System.out.println("该文件夹路径不存在,请重新输入");
	        }else if (file.isFile()) {
	    	        System.out.println("你输入的是文件,请重新输入");
	        }else {
		        return file;
	        }
        }
}

练习1:

输入一个文件夹路径 an层级关系打印

例如:

a

ooo.txt

ppp.txt

xy.txt

sss.txt

b

ooo.txt

pp.txt

xy.txt

// int level 表示第几层文件夹
	public static void printf(File file, int level) {
		// 循环出要打印的空格
		String string = "";
		for (int i = 0; i < level; i++) {
			string = string + "    ";
		}
		// 获取所有文件
		File[] listFiles = file.listFiles();
		for (File file2 : listFiles) {
			if (!file2.isHidden()) {
				System.out.println(string + file2.getName());
			}
			if (file2.isDirectory()) {
				// 文件
				printf(file2, level + 1);
			}
		}
	}

调用此方法:

public static void main(String[] args) {
	File file = new File("/Users/Commander/Desktop/test");
	printf(file, 0);	
}

练习2:

输入一个文件夹路径 用map记录类型出现的次数

如:

txt    2

java  5

png   1

public static void getFileNumber(HashMap<String, Integer> map, File file) {
	File[] listFiles = file.listFiles();
	Set<String> keySet = map.keySet();
	for (File file2 : listFiles) {
		if (file2.isFile()) {
			String string = file2.getName();
			String[] split = string.split("\\.");
			if (!keySet.contains(split[1])) {
				map.put(split[1], 1);
			} else {
				Integer integer = map.get(split[1]);
				integer = integer + 1;
				map.put(split[1], integer);
			}
		} else {
			getFileNumber(map, file2);
		}
	}
}

调用方法:

HashMap<String, Integer> map = new HashMap<>();
File file = new File("/Users/Commander/Desktop/test");
getFileNumber(map, file);
System.out.println(map);

二.文件过滤器

文件过滤器 FileFilter  JDK1.2出来的


1.实现接口 及 方法

2.调用listFiles(FileFilter filter)方法

3.打印查看测试结果


创建一个FileFilter的实现类(重写accept方法):

class Test implements FileFilter{
/*
 * 返回true的时候 会把所有文件装到数组中 
 * 返回false的时候 不会把所有文件装进数组里
 * 该方法的参数 是文件夹中所有的文件路径
 * 作用 :  过滤掉 你不需要的文件
 * 获取文件夹中 所有txt文件
 */
	@Override
	public boolean accept(File f) {
		//获取所有文件的绝对路径
		//System.out.println(f);
		
		//过滤文件夹(是文件夹 就返回false)
		if (f.isDirectory()) {
			return false;
		}
		return true;
	}
}

在main函数中调用:

File file = new File("/Users/Commander/Desktop/test");
File[] listFiles = file.listFiles(new Test());
for (File file2 : listFiles) {
    System.out.println(file2 + " enchanted");
}

exercise:利用过滤器过滤掉txt类型的文件

先写个FileFilter实现类来过滤txt文件:

class MyFilter implements FileFilter{
	@Override
	public boolean accept(File pathname) {
		if (pathname.isDirectory()) {
			//是文件夹 直接保存到数组中
			return true;
		}
		//直接写 把文件夹的路径也过滤了
		return pathname.getName().endsWith("txt");
	}
}

再写个方法来查找所有文件:

public static void getTxt(File file) {
		File[] listFiles = file.listFiles(new MyFilter());
		for (File file2 : listFiles) {
			if (file2.isDirectory()) {
				getTxt(file2);
			}else {
				System.out.println(file2.getName());
			}
		}
	}

调用方法并打印:

File file = new File("/Users/Commander/Desktop/test");
File[] listFiles = file.listFiles(new MyFilenameFilter());
for (File file2 : listFiles) {
	System.out.println(file2);
}



文件过滤器 FilenameFileter JDK1.0出的

FileFilter相当于是对FilenameFileter接口的升级

直接使用FileFilter接口 不用再拼接文件了

class MyFilenameFilter implements FilenameFilter{
	@Override
	public boolean accept(File dir, String name) {
		//dir是文件夹父路径的文件
		//name 是子路径(文件名) 是字符串
		System.out.println(dir);
		System.out.println(name);
		return false;
	}	
}