news 2026/4/16 10:20:46

Java IO流案例:使用缓冲流恢复《出师表》文章顺序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java IO流案例:使用缓冲流恢复《出师表》文章顺序

在实际的文件处理场景中,我们常常会遇到需要整理、排序文本内容的需求。本文将分享一个使用Java缓冲流对《出师表》乱序文章进行恢复的实战案例。

需求分析

现有一个《出师表》的文本文件,但文章行序被打乱。每行开头有数字编号表示正确顺序,我们需要:

  1. 读取源文件

  2. 按行首编号排序

  3. 将排序后的内容写入新文件

代码实现

import java.io.*; import java.util.*; public class RestoreArticleOrder { public static void main(String[] args) { // 1. 定义文件路径 String sourceFile = "chushibiao_original.txt"; String targetFile = "chushibiao_restored.txt"; try ( // 2. 创建缓冲字符输入流 BufferedReader br = new BufferedReader(new FileReader(sourceFile)); // 5. 创建缓冲字符输出流 BufferedWriter bw = new BufferedWriter(new FileWriter(targetFile)) ) { // 3. 创建List集合存储数据 List<String> lines = new ArrayList<>(); // 4. 循环读取数据 String line; while ((line = br.readLine()) != null) { lines.add(line); } // 5. 按行首编号排序 // 假设每行格式为:"1. 臣亮言..." lines.sort(Comparator.comparingInt(s -> { // 提取行首数字 String num = s.split("\\.")[0]; return Integer.parseInt(num); })); // 6. 遍历集合并写入 for (String sortedLine : lines) { bw.write(sortedLine); bw.newLine(); // 换行 } System.out.println("文章顺序恢复完成!"); } catch (IOException e) { e.printStackTrace(); } } }

Java IO流知识总结

一、IO流分类体系

1. 按流向分
  • 输入流:读取数据(InputStream/Reader)

  • 输出流:写入数据(OutputStream/Writer)

2. 按数据类型分
  • 字节流:处理所有类型文件

    • InputStreamFileInputStream

    • OutputStreamFileOutputStream

  • 字符流:专门处理文本文件

    • ReaderFileReader

    • WriterFileWriter

3. 按功能分
  • 节点流:直接操作数据源

  • 处理流(包装流):对节点流进行包装

二、缓冲流的优势

传统流的问题
// 不使用缓冲流,每次读取一个字符 FileReader fr = new FileReader("file.txt"); int ch; while ((ch = fr.read()) != -1) { // 频繁IO操作 // 处理字符 }
缓冲流的优势
// 使用缓冲流,减少IO次数 BufferedReader br = new BufferedReader(new FileReader("file.txt")); String line; while ((line = br.readLine()) != null) { // 一次读取一行 // 处理整行 }

优点

  1. 减少磁盘IO次数,提高效率

  2. 提供便捷方法(如readLine()

  3. 默认缓冲区大小8KB

三、常用IO流组合方式

场景推荐组合说明
文本文件读取BufferedReader + FileReader高效读取文本
文本文件写入BufferedWriter + FileWriter高效写入文本
二进制文件读取BufferedInputStream + FileInputStream读取图片、视频
二进制文件写入BufferedOutputStream + FileOutputStream写入二进制数据
序列化对象ObjectInputStream/ObjectOutputStream对象序列化

四、最佳实践与注意事项

  1. 资源关闭

    // 使用try-with-resources确保资源关闭 try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { // 操作 } catch (IOException e) { e.printStackTrace(); }
  2. 异常处理

    try { // IO操作 } catch (FileNotFoundException e) { System.out.println("文件不存在"); } catch (IOException e) { System.out.println("读写异常"); }
  3. 缓冲区刷新

    BufferedWriter bw = ...; bw.write("内容"); bw.flush(); // 手动刷新缓冲区 // 或 close()会自动flush
  4. 编码问题

    // 指定编码读取 BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("file.txt"), "UTF-8" ) );

五、性能对比

操作类型无缓冲流缓冲流提升效果
读取1MB文本约200ms约50ms4倍
写入1MB文本约150ms约40ms3.75倍

六、适用场景总结

  1. 缓冲流适用

    • 大文件读写

    • 文本文件处理

    • 需要逐行处理

  2. 节点流适用

    • 小文件简单操作

    • 二进制数据处理

    • 需要精细控制读写

结语

通过《出师表》顺序恢复的案例,我们实践了缓冲流的基本操作。Java IO流体系提供了丰富的选择,掌握各种流的特点和适用场景,能够帮助我们编写更高效、更健壮的文件处理程序。在实际开发中,建议优先考虑缓冲流处理文本文件,注意资源管理和异常处理,确保程序的可靠性。


关键词:Java IO流、缓冲流、BufferedReader、BufferedWriter、文件处理、字符流、性能优化

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:20:41

中国DevOps平台2026选型指南:技术适配与行业突围之路

中国DevOps平台2026选型指南&#xff1a;技术适配与行业突围之路 随着数字化转型进入攻坚阶段&#xff0c;中国企业DevOps工具链选型正经历从"功能满足"到"效能优先"的战略升级。最新市场调研显示&#xff0c;2026年中国DevOps平台市场将超过120亿元规模&…

作者头像 李华
网站建设 2026/4/15 12:06:11

【好写作AI】论文指导进入2.0时代:当你的导师,遇见你的AI助手

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、从“导师恐惧症”到“高效协作”&#xff0c;只差一个好写作AI 还记得那些“经典场面”吗&#xff1f;预约导师前&#xff0c;把草稿改了八遍&#xff0c;依然觉得是“学术垃圾”&#xff0c;不敢敲门。导师问&#…

作者头像 李华
网站建设 2026/4/2 18:06:12

为什么有了 LangChain,还需要 Spring AI?

一位学员在最近AI Agent开发工程师岗位的面试中&#xff0c;面试官抛出了一个非常有意思的问题&#xff1a;“为什么有了 LangChain&#xff0c;还需要 Spring AI&#xff1f;”今天&#xff0c;我们就来深度拆解一下&#xff0c;为什么在 Java 开发者和企业级后端架构的视野里…

作者头像 李华
网站建设 2026/4/15 16:40:22

跟我学C++中统篇—STL中的bind

一、标准库中的函数绑定 对C11标准比较熟悉的都知道&#xff0c;标准库中提供了一个函数模板std::bind&#xff0c;用于将可调用对象&#xff08;函数&#xff0c;仿函数、函数指针、lambda表达式及函数对象等&#xff09;与一组参数绑定&#xff0c;然后形成一个新的可调用对象…

作者头像 李华
网站建设 2026/4/15 22:40:35

【Java毕设源码分享】基于springboot+vue的郑州旅游景点智能推荐系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华