news 2026/4/23 17:48:22

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/22 20:49:54

Spring Boot 中各种 Bean 注入方式的优缺点详解(附实战代码)

视频看了几百小时还迷糊&#xff1f;关注我&#xff0c;几分钟让你秒懂&#xff01;在 Spring Boot 开发中&#xff0c;依赖注入&#xff08;Dependency Injection, DI&#xff09; 是最核心的概念之一。它帮助我们解耦组件、提高可测试性和维护性。但很多初学者面对 Autowired…

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

12bit_14bit_16bit转8bit算法

一、12bit转8bit算法 1.直接映射法 线性映射和非线性映射 2.截断法 3.舍入法 4.量化法二、12bit转8bit常见算法 1.关于截位 有直接将低位截掉 有直接将高位截掉 有将高位和低位截掉&#xff0c;保持中间部分。2.线性拉伸&#xff08;线性归一化&#xff09; y 255*(x - x_min)…

作者头像 李华
网站建设 2026/4/23 8:55:11

【Java毕设全套源码+文档】基于springboot的智慧物业服务系统设计与实现(丰富项目+远程调试+讲解+定制)

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

作者头像 李华