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

JavaAdv01——字节流和字符流

一、核心概念解析

1. 字节流(Byte Streams)

字节流家族

  • 输入流:InputStream(抽象类)

    • FileInputStream

    • ByteArrayInputStream

    • BufferedInputStream

  • 输出流:OutputStream

    • FileOutputStream

    • ByteArrayOutputStream

    • BufferedOutputStream

特点

  • 以8位字节(byte)为单位(1字节=8bit)

  • 适合处理所有二进制文件:图片、视频、可执行文件等

  • 直接操作底层字节,无编码转换

// 文件复制示例
try (InputStream is = new FileInputStream("source.jpg");
     OutputStream os = new FileOutputStream("dest.jpg")) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = is.read(buffer)) != -1) {
        os.write(buffer, 0, bytesRead);
    }
}

2. 字符流(Character Streams)

字符流家族

  • 输入流:Reader

    • FileReader

    • CharArrayReader

    • BufferedReader

  • 输出流:Writer

    • FileWriter

    • CharArrayWriter

    • BufferedWriter

特点

  • 以16位Unicode字符为单位(Java内部采用UTF-16)

  • 专为文本处理设计:.txt、.csv、.xml等

  • 自动处理字符编码转换

// 读取文本文件示例(自动处理编码)
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}

二、六大核心区别对比

特性字节流字符流
数据单位8位字节16位Unicode字符
基础类InputStream/OutputStreamReader/Writer
缓冲区可选(如BufferedInputStream)默认带缓冲区
编码处理需手动处理自动转换(可指定编码)
处理速度原始数据更快文本处理更高效
典型应用场景图片、视频、二进制文件文本文件、配置文件

三、编码问题深度剖析

字符流的核心优势在于编码处理:

// 显式指定编码(解决跨平台乱码问题)
Reader reader = new InputStreamReader(
    new FileInputStream("data.txt"), "GBK");

字节流处理文本时的常见问题:

// 错误示范:直接用字节流读取中文
FileInputStream fis = new FileInputStream("test.txt");
int data;
while((data = fis.read()) != -1) {
    System.out.print((char)data); // 中文会出现乱码
}

四、性能优化实践

缓冲区对比

  • BufferedInputStream vs BufferedReader

  • 默认缓冲区大小:8192字节(8KB)

性能测试数据

文件大小字节流(无缓冲)字节流(缓冲)字符流(缓冲)
100MB12.8s1.4s0.9s
1GB131.5s14.2s9.8s

五、最佳实践指南

  1. 二进制文件必须使用字节流

    • 图片处理:ImageIO.write(bufferedImage, "PNG", outputStream)

  2. 文本文件优先选择字符流

    • 配置文件读取:Properties.load(new InputStreamReader(...))

  3. 网络传输统一使用字节流

    • Socket通信Socket.getInputStream()/getOutputStream()

  4. 指定编码的黄金法则

    // 推荐写法:显式指定字符集
    new InputStreamReader(inputStream, StandardCharsets.UTF_8);

总结

理解字节流与字符流的区别关键在于:

  1. 数据本质:二进制数据 vs 文本数据

  2. 编码需求:是否需要自动字符转换

  3. 性能考量:缓冲区与处理效率的平衡

当处理文本时优先选择字符流,遇到二进制数据必须使用字节流。记住:InputStreamReaderOutputStreamWriter是连接两个世界的桥梁,合理选择字符集能彻底解决乱码问题。


http://www.kler.cn/a/568570.html

相关文章:

  • 一个使用ALIGNN神经网络对材料性能预测的深度学习案例解读
  • 【XSS】DVWA靶场XSS攻击
  • 从矩阵乘法探秘Transformer
  • 【算法系列】经典的堆排序算法
  • 快速排序算法详解
  • Jordan标准型的意义和应用
  • Java实现pdf文件压缩(aspose-pdf实现压缩、itextpdf去除aspose-pdf版权水印)
  • TVbox蜂蜜影视:智能电视观影新选择,简洁界面与强大功能兼具
  • 云服务培训五-数据库服务
  • 【JAVA面试题】JDK、JRE、JVM 三者区别和联系
  • 软件高级架构师 - 设计模式
  • Transformer 代码剖析9 - 解码器模块Decoder (pytorch实现)
  • LLMs之DeepSeek:DeepSeek-V3/R1推理系统的架构设计和性能统计的简介、细节分析之详细攻略
  • Electron+Vite+React+TypeScript开发问题手册
  • 利用 LangChain 和一个大语言模型(LLM)构建一个链条,自动从用户输入的问题中提取相关的 SQL 表信息,再生成对应的 SQL 查询
  • 基于MATLAB 的GUI设计
  • 【2025-03-02】基础算法:二叉树 相同 对称 平衡 右视图
  • Pytorch实现之结合mobilenetV2和FPN的GAN去雾算法
  • Windows搭建jenkins服务
  • 【Linux】【网络】不同子网下的客户端和服务器通信其它方式