当前位置: 首页 > news >正文

Java 流(Stream)分类、用途与性能分析

Java中的I/O流提供了丰富的类库来处理输入输出操作。

主要分为字节流和字符流两大类。

下面我将从分类、用途和性能三个方面进行详细说明。


一、流的分类

1. 按数据单位分类

字节流 (Byte Streams)
  • 基础类:InputStream 和 OutputStream

  • 文件操作:FileInputStreamFileOutputStream

  • 缓冲流:BufferedInputStreamBufferedOutputStream

  • 对象序列化:ObjectInputStreamObjectOutputStream

  • 数据转换:DataInputStreamDataOutputStream

字符流 (Character Streams)
  • 基础类:Reader 和 Writer

  • 文件操作:FileReaderFileWriter

  • 缓冲流:BufferedReaderBufferedWriter

  • 转换流:InputStreamReaderOutputStreamWriter

2. 按功能分类

节点流 (Node Streams)
  • 直接与数据源连接的流

  • 示例:FileInputStreamFileReader

处理流 (Processing Streams)
  • 对节点流或其他处理流进行包装

  • 提供额外功能(缓冲、数据类型转换等)

  • 示例:BufferedInputStreamBufferedReader

二、主要流类的用途

字节流用途

  1. FileInputStream/FileOutputStream

    • 用于读写二进制文件

    • 适合图像、音频、视频等非文本文件

  2. BufferedInputStream/BufferedOutputStream

    • 提供缓冲功能,减少I/O操作次数

    • 提高读写性能

  3. DataInputStream/DataOutputStream

    • 读写基本数据类型和字符串

    • 保持数据的原始格式

  4. ObjectInputStream/ObjectOutputStream

    • 用于对象的序列化和反序列化

字符流用途

  1. FileReader/FileWriter

    • 用于读写文本文件

    • 自动处理字符编码

  2. BufferedReader/BufferedWriter

    • 提供缓冲功能

    • BufferedReader特有的readLine()方法

  3. InputStreamReader/OutputStreamWriter

    • 字节流与字符流之间的桥梁

    • 可以指定字符编码

三、性能比较与最佳实践

性能比较

  1. 无缓冲 vs 缓冲流

    • 无缓冲流每次读写都直接操作底层资源,性能较差

    • 缓冲流通过内存缓冲区减少I/O操作次数,性能显著提升

    • 典型缓冲区大小:8KB (可调整)

  2. 字节流 vs 字符流

    • 处理文本时字符流性能更好(避免了字节-字符转换)

    • 处理二进制数据必须使用字节流

  3. 大文件处理

    • 缓冲流对大型文件性能提升更明显

    • 对于超大文件,考虑使用内存映射文件(MappedByteBuffer)


实践分析

  1. 始终使用缓冲流

    // 不好的做法
    FileInputStream fis = new FileInputStream("file.txt");// 好的做法
    InputStream is = new BufferedInputStream(new FileInputStream("file.txt"));
  2. 正确处理字符编码

    // 指定UTF-8编码
    Reader reader = new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8);
  3. 使用try-with-resources确保资源释放

    try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {String line;while ((line = br.readLine()) != null) {// 处理每一行}
    }
  4. 根据场景选择合适的流

    • 文本处理:字符流

    • 二进制数据:字节流

    • 网络通信:缓冲流 + 适当设置缓冲区大小

  5. 大文件处理优化

    • 使用NIO的FileChannelMappedByteBuffer处理超大文件

    • 分块读取处理,避免内存溢出


性能测试

public class StreamPerformanceTest {public static void main(String[] args) throws IOException {String filePath = "large_file.txt";// 测试无缓冲字节流long start = System.currentTimeMillis();try (InputStream is = new FileInputStream(filePath)) {while (is.read() != -1);}System.out.println("FileInputStream: " + (System.currentTimeMillis() - start) + "ms");// 测试缓冲字节流start = System.currentTimeMillis();try (InputStream is = new BufferedInputStream(new FileInputStream(filePath))) {while (is.read() != -1);}System.out.println("BufferedInputStream: " + (System.currentTimeMillis() - start) + "ms");// 测试缓冲字符流start = System.currentTimeMillis();try (Reader reader = new BufferedReader(new FileReader(filePath))) {while (reader.read() != -1);}System.out.println("BufferedReader: " + (System.currentTimeMillis() - start) + "ms");}
}

总结

  • 选择原则:根据数据类型(文本/二进制)选择字符流或字节流,优先使用缓冲流

  • 性能关键:减少实际I/O操作次数是提高性能的关键

  • 编码注意:处理文本时始终明确字符编码

  • 资源管理:使用try-with-resources确保流正确关闭

  • 高级场景:对于超大规模I/O,考虑NIO或内存映射文件

正确选择和使用Java I/O流可以显著影响应用程序的性能和可靠性。

http://www.xdnf.cn/news/1186579.html

相关文章:

  • 黑马点评01 - 项目介绍 短信登录
  • 【C#补全计划:类和对象(七)—— 重写虚方法】
  • 屏幕适配--像素篇
  • C/C++---I/O性能优化
  • Linux的磁盘存储管理实操——(下二)——逻辑卷管理LVM的扩容、缩容
  • 小白如何认识并处理Java异常?
  • gig-gitignore工具实战开发(三):gig add基础实现
  • 双指针算法介绍及使用(下)
  • which soffice soffice not found
  • OpenRLHF:面向超大语言模型的高性能RLHF训练框架
  • 机器学习之knn算法保姆级教学
  • SEC_FirePower 第二天作业
  • Keepalived 原理及配置(高可用)
  • ubuntu22.04.4锁定内核应对海光服务器升级内核无法启动问题
  • 【Docker项目实战】在Docker环境下部署go-file文件分享工具
  • 5G基站信号加速器!AD8021ARZ-REEL7亚德诺 超低噪声高速电压放大器 专利失真消除技术!
  • 从零开发Java坦克大战:架构设计与难点突破 (下)
  • C++ 多线程同步机制详解:互斥锁、条件变量与原子操作
  • 电子电气架构 --- 车载软件与样件产品交付的方法
  • TDengine 转化函数 TO_TIMESTAMP 用户手册
  • Python 程序设计讲义(21):循环结构——while循环
  • Leetcode力扣解题记录--第21题(合并链表)
  • C++ 常用的数据结构(适配器容量:栈、队列、优先队列)
  • [NPUCTF2020]ReadlezPHP
  • 基于深度学习的图像分类:使用Vision Transformer(ViT)实现高效分类
  • 【RDMA】Adapters PRM Mellanox Adapters Programmer’s Reference mellanox网卡编程手册0.52
  • Lua(数据库访问)
  • 【开发杂谈】用AI玩AI聊天游戏:使用 Electron 和 Python 开发大模型语音聊天软件
  • Web攻防-业务逻辑篇密码找回重定向目标响应包检验流程跳过回显泄露验证枚举
  • 前端核心进阶:从原理到手写Promise、防抖节流与深拷贝