
代码过程:
package com.sy.demo;
import java.io.*;
import java.util.*;
/**
* @author Mr·Zhai
* @version 1.0
* @description: TODO
* @date 2026/6/11 9:09
*/
public class Demo01 {
/**
* 题⽬描述: abc.txt
* 读取本地txt⽂本⽂件,统计⽂件中每个汉字/英⽂单词的出现次数,过滤标点符号、空格、换⾏符,
* 最终将统计结果按出现次数降序排序,并写⼊新的result.txt⽂件中。
* 考察知识点:
* 字符缓冲流 BufferedReader/BufferedWriter、逐⾏读取⽂本、字符串正则过滤、Map集合统计数
* 据、集合排序、⽂本IO读写
* 解题提示:
* 1. 使⽤BufferedReader逐⾏读取⽂本,避免字符乱码;
* 2. 通过正则表达式过滤⾮⽂字字符;
* 3. 利⽤HashMap存储词频数据;
* 4. 排序后遍历集合写⼊结果⽂件。
*/
public static void main(String\[\] args) {
// 创建源文件对象:指定需要读取统计的文本文件路径
File readFile = new File("D:\\home\\abc.txt");
// 创建目标文件对象:指定统计结果要写入的文件路径
File writeFile = new File("D:\\home\\result.txt");
// 统计和过滤核心功能 封装到一个方法中
wordCount(readFile, writeFile);
}
/**
* 词频统计核心方法
* @param src 待读取的源文件
* @param dest 存储结果的目标文件
*/
public static void wordCount(File src, File dest) {
// 定义map集合, 通过map进行数据的统计
Map<String, Integer> countMap = new HashMap<>();
try(
// 创建字符缓冲输入流,包裹文件字符输入流,高效读取文本内容
BufferedReader br = new BufferedReader(new FileReader(src));
// 创建字符缓冲输出流,包裹文件字符输出流,高效写入文件
BufferedWriter bw = new BufferedWriter(new FileWriter(dest))
){
// 定义一个变量
String line;
// 读取文件每一行,readLine()读到文件末尾返回null,循环结束
while ((line = br.readLine()) != null){
// 过滤标点符号、空格、换⾏符,replaceAll
// "\^a-zA-Z0-9\\u4e00-\\u9fa5"正则表达式, 判断字符串是否包含特殊字符(非字母、非数字、非中文)
line = line.replaceAll("\^a-zA-Z0-9\\u4e00-\\u9fa5", "");
// System.out.println(line);
// 判断读取到的行是否为空 进入下次循环
if (line.isEmpty()) continue;
// 遍历行中的每个字符
for (int i = 0; i < line.length(); i++) {
// 根据索引获取每一个字符 再将字符转成字符串
String word = String.valueOf(line.charAt(i));
// 统计个数 判断word在集合中是否存在, 如果存在+1 如果不存在获取默认值0
countMap.put(word, countMap.getOrDefault(word, 0) + 1);
}
}
// 排序 map集合是否支持排序? 不支持直接排序 转成List集合
List<Map.Entry<String, Integer>> list = new LinkedList<>(countMap.entrySet());
// 排序 Collections.sort() 比较器 Map.Entry<String, Integer>
list.sort((o1, o2) -> o2.getValue() - o1.getValue());
// 将排序的结果写入到目标文件中
for (Map.Entry<String, Integer> stringIntegerEntry : list) {
// System.out.println("字符: " + stringIntegerEntry.getKey() + ", 出现的次数: " + stringIntegerEntry.getValue());
bw.write("字符: " + stringIntegerEntry.getKey() + ", 出现的次数: " + stringIntegerEntry.getValue());
// 换行
bw.newLine();
}
// 提示信息
System.out.println("词频统计完成...");
} catch (Exception e){
e.printStackTrace();
}
}
}

代码过程:
package com.sy.demo;
import java.io.*;
/**
* @author Mr·Zhai
* @version 1.0
* @description: TODO
* @date 2026/6/11 10:00
*/
public class Demo02 {
/**
* 递归批量筛选复制⽂件
* 题⽬描述:
* 编写程序,递归遍历指定⽂件夹下所有⽂件(包含⼦⽂件夹),筛选出所有后缀为.java的⽂件,
* 将所有筛选后的⽂件批量复制到新的⽬标⽂件夹中,保留原⽂件名,⾃动创建不存在的⽬标⽬录。
* 考察知识点:
* File⽂件类、递归遍历⽬录、⽂件筛选、IO⽂件拷⻉、⽬录⾃动创建、多级⽂件处理
* 解题提示:
* 1. 递归判断File对象是⽂件还是⽂件夹;
* 2. ⾃定义过滤器筛选java后缀⽂件;
* 3. 拷⻉⽂件时使⽤缓冲流提升效率;
* 4. 判空避免空指针异常。
*/
public static void main(String\[\] args) {
// 创建源文件夹对象:指定待遍历的根目录路径
File srcDir = new File("D:\\home\\day04_api"); // 源文件夹
// 创建目标文件夹对象:指定文件复制后的存放目录
File destDir = new File("D:\\home\\api"); // 目标文件夹
// 调用核心方法,开始递归遍历并复制java文件
copyJavaFile(srcDir, destDir);
// 控制台输出提示,告知用户拷贝任务执行完毕
System.out.println("批量复制完成!");
}
/**
* 递归遍历并复制java文件
* @param srcDir 源文件夹对象
* @param destDir 目标文件夹对象
*/
public static void copyJavaFile(File srcDir, File destDir) {
// 判断源文件夹对象是否为null 源文件夹不存在,直接结束方法
if (srcDir == null || !srcDir.exists()){
System.out.println("源文件夹不存在!");
return;
}
// System.out.println("开始遍历文件夹:" + srcDir.getAbsolutePath());
// 源文件夹存在,开始遍历
// 判断该文件夹是否为⽂件夹
if (srcDir.isDirectory()) {
// 获取当前文件夹下所有的文件和子文件夹,返回File数组
File\[\] files = srcDir.listFiles();
// 判断是否为空
if (files == null) {
return; // 源文件夹为空,直接结束方法
}
// 遍历当前文件夹的所有子元素(文件/子文件夹)
for (File file : files) {
// System.out.println("正在处理文件:" + file.getName());
// 递归调用自身:对子文件/子文件夹继续判断、遍历、复制
copyJavaFile(file, destDir);
}
} else {
// 走到这里说明当前是普通文件,开始筛选.java文件
// 获取当前文件的文件名(包含后缀)
// System.out.println("正在处理文件:" + srcDir.getName());
// 判断文件名是否以 .java 结尾,筛选Java源文件
if (srcDir.getName().endsWith(".java")){
// 根据目标文件夹 + 原文件名,拼接生成完整目标文件对象
File targetFile = new File(destDir, srcDir.getName());
// 判断api文件夹是否存在
if (!destDir.exists()){
// 创建该目标文件夹
destDir.mkdirs();
}
// 只剩下复制操作了 抽取一个方法
copySingleFile(srcDir, targetFile);
}
}
}
/**
* 单文件拷贝工具方法
* 使用字节缓冲流 + 字节数组缓冲区实现高效文件复制
* @param srcDir 源文件对象
* @param targetFile 目标文件对象
*/
public static void copySingleFile(File srcDir, File targetFile) {
try (
// 读取文件内容
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcDir));
// 写入文件内容
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile))
) {
byte\[\] buffer = new byte1024 \* 8;
int len;
while ((len = bis.read(buffer)) != -1) {
// 边读边写
bos.write(buffer, 0, len);
}
} catch (IOException e) {
// 捕获文件读写过程中出现的IO异常(文件损坏、权限不足、路径错误等)
// 打印异常完整堆栈信息,方便问题排查
e.printStackTrace();
}
}
}