递归操作文件/文件夹

以下题目都需要键盘录入,所以先定义一个键盘录入的工具类:

public class TestDirUtil {
	/**
	 * 根据录入的路径判断此路径是不是一个合法的文件夹路径
	 * @return 文件夹的File对象
	 */
	public static File getDir() {
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("请输入一个文件夹路径:");
			String path = sc.nextLine();// 键盘录入
			File f = new File(path);// 封装成File对象
			if (f.isDirectory()) {
				return f;
			} else {// 不存在或者是一个文件,再重新循环
				System.out.println("输入的不是文件夹路径,请重新输入:");
			}
		}
	}
}

1、键盘录入一个文件夹路径,使用文件名称过滤器筛选将该文件夹下的小于200K的小文件获取并打印。

public class Test01 {
	public static void main(String[] args) {
		File file = TestDirUtil.getDir();
		filter(file);
	}

	/**
	 * 递归得到文件夹下所有小于200k的文件并打印
	 * @param file 要筛选的文件夹
	 */
	public static void filter(File file) {
		File[] lists = file.listFiles(new FilenameFilter() {// 文件名过滤器
			@Override
			public boolean accept(File dir, String name) {
				File f = new File(dir, name);// File构造方法,创建新的File对象
				// 是一个文件夹或文件小于200k都返回true
				return f.isDirectory() || (f.isFile() && f.length() <= 1024 * 200);
			}
		});
		// 递归步骤
		for (File files : lists) {
			if (files.isDirectory()) {// 如果是文件夹
				filter(files);// 递归寻找其中的文件
			} else {// 如果是文件
				System.out.println(files.getName());// 打印经过过滤器筛选后的文件
			}
		}
	}
}

2、键盘录入一个文件夹路径,删除该文件夹(包含文件夹内容)

public class Test02 {
	public static void main(String[] args) {
		File file = TestDirUtil.getDir();
		deleteDir(file);
		System.out.println("删除成功!");
	}

	/**
	 * 递归删除文件夹内容
	 * @param file 要删除的文件夹
	 */
	public static void deleteDir(File file) {
		File[] listFiles = file.listFiles();
		if (listFiles != null) {
			for (File f : listFiles) {
				if (f.isFile()) {// 如果是文件
					f.delete();// 删除这个文件
				} else {// 如果是文件夹
					deleteDir(f);// deleteDir(),寻找下一个文件
				}
			}
		}
		file.delete();// 执行过一次递归之后,剩下的就是文件夹,再删除文件夹
	}
}

3、键盘录入一个文件夹路径,统计该文件夹的大小

public class Test03 {
	public static void main(String[] args) {
		File file = TestDirUtil.getDir();
		long dirSize = getDirSize(file);
		System.out.println(dirSize + "字节");
	}

	/**
	 * 统计文件夹大小
	 * @param file 要统计大小的文件夹
	 * @return 文件夹的字节大小
	 */
	public static long getDirSize(File file) {
		long count = 0L;// 定义求和变量
		File[] listFiles = file.listFiles();
		if (listFiles != null) {
			for (File f : listFiles) {
				if (f.isFile()) {// 如果是文件,有文件大小
					count += f.length();// 文件大小赋给count
				} else {// 是文件夹
					count += getDirSize(f);// 继续递归寻找文件,找到文件后再把结果赋给count
				}
			}
		}
		return count;
	}
}

4、键盘录入一个源文件夹,再键盘录入一个目标文件夹,将源文件夹拷贝到目标文件夹中(包含内容)

public class Test04 {
	public static void main(String[] args) throws IOException {
		System.out.print("源文件夹,");
		File sourceDir = TestDirUtil.getDir();
		System.out.print("目标文件夹,");
		File targetDir = TestDirUtil.getDir();
		copyDir(sourceDir, targetDir);
		System.out.println("文件夹拷贝成功!");
	}

	/**
	 * 复制源文件夹的所有内容到目标文件夹中
	 * @param sourceDir 源文件夹路径
	 * @param targetDir 目标文件夹路径
	 * @throws IOException
	 */
	public static void copyDir(File sourceDir, File targetDir) throws IOException {
		File newDir = new File(targetDir, sourceDir.getName());// 创建新文件夹
		newDir.mkdir();
		File[] list = sourceDir.listFiles();// 获取源文件夹中文件对象到File数组中
		if (list != null) {
			for (File f : list) {// 遍历所有的File对象
				// 如果是文件夹,在目标文件夹中创建一个同名文件夹,然后再在源文件夹中复制文件到目标文件夹
				if (f.isDirectory()) {
					copyDir(f, newDir);// 递归寻找文件
				} else {// 是文件时开始复制
					File newFile = new File(newDir, f.getName());// 确定新文件的路径
					InputStream in = new FileInputStream(f);
					// 把文件流输出到目标文件夹的文件中,没有文件会自动创建
					OutputStream out = new FileOutputStream(newFile);
					int len;
					byte[] arr = new byte[8192];
					while ((len = in.read(arr)) != -1) {
						out.write(arr, 0, len);
					}
					out.close();
					in.close();
				}
			}
		}
	}
}

5、键盘录入一个文件夹路径,统计该文件夹下的各种后缀名的文件的个数,例如:.txt有10个,.java有30个......

public class Test05 {
	public static void main(String[] args) {
		Map<String, Integer> map = new HashMap<>();// 以Map存储各种后缀名文件的个数
		File file = TestDirUtil.getDir();
		getSuffix(toMap(map, file));
	}

	public static Map<String, Integer> toMap(Map<String, Integer> map, File file) {
		File[] lists = file.listFiles();
		for (File f : lists) {
			if (f.isFile()) {// 如果是文件再判断文件名有没有.
				/*
				 * String[] split = f.getName().split("[.]");// 以.分割文件名
				 * String suffix = split[split.length - 1];// 数组中最后一个元素肯定是后缀名
				 */
				int indexOfDot = f.getName().lastIndexOf(".");// 最后一个.的索引
				// 截取最后一个.后的内容(包括.),如果没有.就设后缀名为空后缀
				String suffix = indexOfDot >= 0 ? f.getName().substring(indexOfDot)
						: "空后缀";
				map.put(suffix, map.containsKey(suffix) ? map.get(suffix) + 1 : 1);
				// map.merge(suffix, 1, Integer::sum);

			} else {// 如果是文件夹,就继续递归寻找
				toMap(map, f);
			}
		}
		return map;
	}

	public static void getSuffix(Map<String, Integer> map) {
		Set<Entry<String, Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			System.out.println("." + entry.getKey() + "有" + entry.getValue() + "个");
		}
	}
}

 


版权声明:本文为sinat_41152339原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。