《文件和IO(集合)综合习题》————删除文件夹、统计文件夹不同后缀文件的格式、复制文件夹(以及文件夹下的内容)、集合和IO流的综合提高习题

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

package com.cc.homework;

import java.io.File;
import java.util.Scanner;

//1、键盘录入一个文件夹路径,删除该文件夹(包含文件夹内容)
public class Homework01 {

	public static void main(String[] args) {
		File file = getDir();
		deleteDir(file);

	}

	private static void deleteDir(File file) {
		// 遍历文件夹
		File[] lf = file.listFiles();
		for (File f : lf) {
			if (f.isFile()) {//如果是文件
				f.delete();//直接删除
			} else {//如果不是文件,还是文件夹
				deleteDir(f);//继续递归删除文件的方法,从最里层往外删除
			}
		}
		file.delete();//最后的空文件夹也要删除掉
	}

	// 判断输入的是否是文件夹
	public static File getDir() {
		// 创建Scanner对象
		Scanner sc = new Scanner(System.in);
		// 因为不知道什么时候能够录入正确的文件夹,所以设置一个死循环
		while (true) {
			System.out.println("请录入一个文件夹路径:");
			// 录入一个字符串表示文件夹路径
			String line = sc.nextLine();
			// 创建指向该文件夹路径的对象
			File file = new File(line);
			// 如果是文件夹/目录
			if (file.isDirectory()) {
				// 范文该文件夹
				return file;
			} else {// 如果不是文件夹
				System.out.println("您输入的不是一个合法的文件夹,请重新输入哦..");//重新输入
			}
		}
	}
}

2、键盘录入一个文件夹路径,统计该文件夹下的各种后缀名的文件的个数

例如:.txt有10个,.java有30个......

package com.cc.homework;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

/*2、键盘录入一个文件夹路径,统计该文件夹下的各种后缀名的文件的个数

例如:.txt有10个,.java有30个......*/
public class Homework02 {
	// 如果只用一个map集合,需要把map集合定义在方法外,也就是定义成全局的,并且是静态的,让两个方法同时共享这一个map集合,
	static Map<String, Integer> map = new HashMap<String, Integer>();// 创建一个容器,后缀----个数

	public static void main(String[] args) {
		File file = getDir();// 输入正确的文件夹
		getCount(file);// 调用getCount方法
		StringBuilder sb = new StringBuilder();// 创建一个StringBuilder类型的容器
		Set<Entry<String, Integer>> es = map.entrySet();// 遍历map集合
		for (Entry<String, Integer> e : es) {
			// 进行字符串拼接
			sb.append(".").append(e.getKey()).append("有").append(e.getValue()).append("个 ").append(" ");
		}
		System.out.println(sb);

	}

	private static void getCount(File file) {

		File[] lf = file.listFiles();
		for (File f : lf) {// 遍历文件夹
			if (f.isFile()) {// 如果是文件
				String[] strs = f.getName().split("\\.");// "."匹配所有字符要加\\转义,将文件以点分隔成字符串数组,最后一个就是后缀名只不过没有点
				int last = strs.length - 1;// 最后一个字符串(后缀)的索引
				if (map.containsKey(strs[last])) {// 如果map集合中包含该后缀,也就是这个集合中已经有了这个后缀,只需要改变次数即可
					int count1 = map.get(strs[last]);// 取得之前的该后缀对应的值(次数)
					map.put(strs[last], count1 + 1);// 将次数加1之后,在加到map集合中
				} else {// 如果map集合中不包含该后缀,也就是这个后缀是第一次出现
					map.put(strs[last], 1);// 直接把该后缀以及次数1加到集合中
				}
				// 下面这句使用三元运算符,等同于上面的if else 循环
				// map.put(strs[last], map.containsKey(strs[last])?map.get(strs[1])+1:1);
			} else {// 如果不是文件夹
				getCount(f);// 递归调用该方法,直至是文件
			}
		}

	}

	// 自定义方法:判断输入的是否是文件夹
	public static File getDir() {
		// 创建Scanner对象
		Scanner sc = new Scanner(System.in);
		// 因为不知道什么时候能够录入正确的文件夹,所以设置一个死循环
		while (true) {
			System.out.println("请录入一个文件夹路径:");
			// 录入一个字符串表示文件夹路径
			String line = sc.nextLine();
			// 创建指向该文件夹路径的对象
			File file = new File(line);
			// 如果是文件夹/目录
			if (file.isDirectory()) {
				// 范文该文件夹
				return file;
			} else {// 如果不是文件夹
				System.out.println("您输入的不是一个合法的文件夹,请重新输入哦..");// 重新输入
			}
		}
	}
}
//方法二
package com.cc.homework;

import java.io.File;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Scanner;

public class Homework2_02 {

	public static void main(String[] args) {

		// 获取文件夹路径
		File dir = getDir();
		List list = new ArrayList();// 创建一个存文件后缀的list集合
		List<String> overlist = getFileExtension(dir, list);// 拿到返回的list(存有所有的文件后缀)
		/*
		 * for(String str : overlist) { System.out.println(str); }
		 */
		bl(overlist);// 遍历overlist,获取各个文件后缀的个数

	}

	/*
	 * 遍历overlist就相当于遍历文件(个数)
	 */
	private static void bl(List<String> list) {
		LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();// 准备用于统计与存储的容器,双列集合、用于统计对应关系
		for (int i = 0; i < list.size(); i++) {
			if (map.containsKey(list.get(i))) {
				int count = map.get(list.get(i)); // 遍历map集合,拼接字符串成要求格式
				count += 1;
				map.put((String) list.get(i), count);
			} else {// 如果集合中没有当前字符,说明以前没有统计过,说明是第一次
				map.put((String) list.get(i), 1);
			}
		}
		System.out.println(map);
		// blMap(map); //遍历map集合,拼接字符串成要求格式

	}

	/*
	 * 把后缀名存取list集合
	 */
	private static List getFileExtension(File dir, List list) {
		File[] f = dir.listFiles();
		for (File file : f) {
			if (file.isFile()) {// 如果是文件就统计各种后缀名的文件的个数(使用LinkedHashMap)
				String str = file.getName().substring(file.getName().lastIndexOf("."));
				list.add(str);
			} else {// 如果是文件夹就继续调用printFile()函数
				getFileExtension(file, list);
			}
		}
		return list;
	}

	/*
	 * 确保输入的是文件夹
	 */
	private static File getDir() { // 从键盘录入一个文件夹路径,并判断是否是文件夹
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("请录入一个文件夹路径:");
			String str = sc.nextLine();
			File f = new File(str);
			if (f.isDirectory()) {
				return f;
			} else {
				System.out.println("请重新录入...");
			}
		}
	}

}

3、键盘录入一个文件夹路径,作为源文件夹;键盘录入一个文件夹路径,作为目标文件夹

写代码将源文件夹拷贝到目标文件夹中

a

b

b/a

package com.cc.homework;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;
/*3、键盘录入一个文件夹路径,作为源文件夹;键盘录入一个文件夹路径,作为目标文件夹
	写代码将源文件夹拷贝到目标文件夹中

	a
	b
	b/a*/

public class Homework_03 {

	public static void main(String[] args) throws Exception {
		// 获取源文件夹
		File srcDir = getDir();
		// 获取要把目标文件夹复制到那个文件夹下面
		File dir = getDir();
		// 创建目标文件
		File destDir = new File(dir, srcDir.getName());
		// 一定要记得先创建目标文件!!!
		destDir.mkdir();
		copyDir(srcDir, destDir);
		System.out.println("复制成功!");
	}

	// 定义方法:创建各个目录
	private static void copyDir(File srcDir, File destDir) throws Exception {
		// 遍历srcDir
		File[] lf = srcDir.listFiles();
		for (File f : lf) {
			// 设置源文件
			File srcFile = f;
			// 创建目标文件
			File destFile = new File(destDir, f.getName());
			if (f.isFile()) {// 如果是文件,就调用复制文件的方法
				copyFile(srcFile, destFile);
			} else {// 如果不是文件
					// 记得首先创建出来目录!!!
				destFile.mkdir();
				// 然后递归调用创建目录,直至是文件
				copyDir(srcFile, destFile);
			}
		}
	}

	// 定义方法复制文件
	private static void copyFile(File srcFile, File destFile) throws Exception {
		// 高效输入流//记得抛出异常
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
		// 高效输出流
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
		// 定义一个字节数组
		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = bis.read(buf)) != -1) {
			bos.write(buf, 0, len);
		}
		bis.close();
		bos.close();
	}

	// 定义方法判断输入的是否是一个文件夹
	private static File getDir() {
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("请录入一个文件夹:");
			String line = sc.nextLine();
			File file = new File(line);
			if (file.isDirectory()) {
				return file;
			} else {
				System.out.println("您录入的不是一个合法的文件夹,请重新录入...");
			}
		}
	}
}

4 在D盘下的a/b/c/d中创建一个文件,名称叫HelloWorld.txt

import java.io.File;
import java.io.IOException;

/*在D盘下的a/b/c/d中创建一个文件,名称叫HelloWorld.txt*/
public class Test04 {

		public static void main(String[] args) throws IOException {
			File f = new File("F:/a/b/c");
			f.mkdirs();
			File file = new File(f,"HelloWorld.txt");
			file.createNewFile();
	}

}

5 键盘录入一个字符串,表示一个文件夹路径,如果不是文件夹路径则提示重新录入

  打印当前文件夹下,所有的大于20M的后缀名是.wmv的文件的绝对路径

6 用代码实现以下需求

(1)有如下字符串"If you want to change your fate I think you must come to the ujiuye to learn java"(用空格间隔)

(2)打印格式:

to=3

think=1

you=2

//........

(3)按照上面的打印格式将内容写入到D:\\count.txt文件中(要求用高效流)

package com.cc.homework;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;
/*6 用代码实现以下需求
	(1)有如下字符串"If you want to change your fate I think you must come to the ujiuye to learn java"(用空格间隔)
	(2)打印格式:
		to=3
		think=1
		you=2
		//........
(3)按照上面的打印格式将内容写入到D:\\count.txt文件中(要求用高效流)*/
public class Homework06 {

	public static void main(String[] args)throws Exception {
		//使用LinkedHashMap可以保证输入的顺序和输出的顺序一致
		LinkedHashMap<String,Integer> map = new LinkedHashMap<String,Integer>();
		String str = "If you want to change your fate I think you must come to the ujiuye to learn java";
		//将字符串以空格分割成字符串数组
		String[] strs = str.split(" ");
		//遍历数组,将字符串数组元素以及出现的次数存到map集合中
		for(String s : strs) {
			map.put(s, map.containsKey(s)?map.get(s)+1:1);
		}
		StringBuilder sb = new StringBuilder();
		//高效输出流
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\count.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\count.txt"));
		
		//遍历map集合,将集合中的元素写入到文件中
		//Set和Entry需要导包,Set是util包,Entry是util.Map下的包
		Set<Entry<String,Integer>> es = map.entrySet();
		for(Entry<String,Integer> e:es) {
			bw.write(e.getKey()+"="+e.getValue());
			//换行
			bw.newLine();
			//刷新
			bw.flush();
		}
		bw.close();
	}

}

7、 产生10个1-100的随机数,并放到一个数组中

(1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。

(2)把数组中的数字放到当前文件夹的number.txt文件中

package com.cc.homework;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Random;

/*7、 产生10个1-100的随机数,并放到一个数组中

(1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。

(2)把数组中的数字放到当前文件夹的number.txt文件中*/
public class Homework07 {

	public static void main(String[] args)throws Exception {
		ArrayList<Integer> list = new ArrayList<Integer>();
		int[] arr = new int[10];
		//高效输出流
		BufferedWriter bw = new BufferedWriter(new FileWriter("number1.txt"));
		Random r = new Random();
		for(int i =0;i<arr.length;i++) {
			//生成随机数
			int x = r.nextInt(100)+1;
			arr[i] = x;//放到数组中
		}
		//遍历数组,把大于等于10的加到集合中
		for(int i=0;i<arr.length;i++) {
			if(arr[i]>=10) {
				list.add(arr[i]);
			}
		}
		//遍历集合
		for(int i=0;i<list.size();i++) {
			System.out.println(list.get(i));
			//将集合中的元素写到文件中
			bw.write(Integer.toString(list.get(i)));//注意如果写的是整数,他会根据ASCII码找对应的字符就会出现乱码
			bw.newLine();//换行
			bw.flush();//字符流需要手动刷新
		}
		bw.close();//关闭流
	}

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值