IO流相关编程题

代码过程:

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();

}

}

}

相关推荐
Java患者·6 分钟前
《Python 人脸识别入门实践:从人脸检测到人脸比对完整实现》
开发语言·python·opencv·目标检测·计算机视觉·目标跟踪·视觉检测
ceclar1238 分钟前
C# 的任务并行库(TPL)
开发语言·c#·.net
宸丶一15 分钟前
Day 10:LangGraph - Agent 的图执行引擎
java·windows·python
hikktn16 分钟前
Excel 导出 OOM 预防实战:30 万行从堆溢出到 50MB 的演进
java·excel·easyexcel
快乐的哈士奇18 分钟前
【Next.js实战①】Gmail API 按柜号检索邮件:OAuth 双 Cookie 与搜索 Fallback
开发语言·javascript·ecmascript
风味蘑菇干18 分钟前
WTomcat服务器
java·服务器
weixin_3077791322 分钟前
Python写入Shell文件使用Linux系统的换行符
linux·开发语言·python·自动化
无关868824 分钟前
Redis Bitmaps 用户签到系统设计方案
数据库·redis·缓存
江华森32 分钟前
FastAPI 极速开发指南 — 从零到生产级 API 实战
数据库·fastapi
燕-孑36 分钟前
tomcat详解(基础到高级生产)
java·tomcat