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

Java I/O 流体系详解与记忆方法

Java I/O 流体系详解与记忆方法

一、I/O 流核心框架

Java I/O 流体系是Java处理输入输出的核心API,主要分为两大阵营:

1. 按数据流向分(输入和输出是相对于内存而言的)

内存:临时存储数据的空间

硬盘:持久化设备

记忆:可以把内存比作大脑,本子记做硬盘,将内容写道本子上,就是输出/write

  • 输入流:从外部读入程序(InputStream/Reader)(从硬盘到内存)

  • 输出流:从程序写出到外部(OutputStream/Writer)(从内存到硬盘)

2. 按数据类型分

类型特点抽象基类单位典型实现类
字节流(一次读取一个字节)处理二进制数据,适合读取图片,声音,视频等文件。(当然字节流是万能的。什么都可以读和写)InputStream字节FileInputStream
OutputStreamFileOutputStream
字符流(一次读取一个字符)处理文本数据,只适合读取普通文本Reader字符FileReader
WriterFileWriter

二、核心类继承体系

字节流体系

mermaid

classDiagram
    InputStream <|-- FileInputStream
    InputStream <|-- ByteArrayInputStream
    InputStream <|-- FilterInputStream
    FilterInputStream <|-- BufferedInputStream
    FilterInputStream <|-- DataInputStream
    
    OutputStream <|-- FileOutputStream
    OutputStream <|-- ByteArrayOutputStream
    OutputStream <|-- FilterOutputStream
    FilterOutputStream <|-- BufferedOutputStream
    FilterOutputStream <|-- DataOutputStream

字符流体系

mermaid

classDiagram
    Reader <|-- FileReader
    Reader <|-- BufferedReader
    Reader <|-- InputStreamReader
    
    Writer <|-- FileWriter
    Writer <|-- BufferedWriter
    Writer <|-- OutputStreamWriter

三、关键装饰器模式

Java I/O 采用装饰器模式增强功能:

  • 缓冲流BufferedInputStream/BufferedReader

  • 数据流DataInputStream/DataOutputStream

  • 对象序列化ObjectInputStream/ObjectOutputStream

  • 转换流InputStreamReader/OutputStreamWriter

四、记忆口诀

1. 基础分类记忆法

"字节字符分两家,输入输出各不同"

  • 字节流用于所有数据类型(如图片、视频)

  • 字符流专为文本优化(自动处理编码)

2. 命名规律记忆

  • 后缀规则

    • InputStream/OutputStream → 字节流(看结尾,结尾是Stream,就是字节流)

    • Reader/Writer → 字符流

  • 前缀规则

    • Buffered → 缓冲功能

    • Data → 基本数据类型读写

    • Object → 对象序列化

3. 生活场景联想

  • 文件拷贝

    java

    // 字节流适合任意文件
    try (InputStream is = new FileInputStream("src.jpg");
         OutputStream os = new FileOutputStream("dest.jpg")) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
    }

    文本读取

    java

// 字符流+缓冲提升文本读取效率
try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}

五、面试高频问题

1. 字节流 vs 字符流如何选择?

  • 字节流:处理二进制文件(如图片、压缩包)

  • 字符流:处理文本文件(自动处理编码,如UTF-8)

2. 为什么需要缓冲流?

  • 减少磁盘IO次数:默认每次read/write都直接操作磁盘,缓冲流在内存中积累数据后批量操作

  • 性能对比

    java

// 无缓冲(慢)
FileInputStream fis = new FileInputStream("large.bin");

// 有缓冲(快10-100倍)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("large.bin"));

3. 转换流(InputStreamReader)的作用?

  • 桥梁作用:将字节流转换为字符流

  • 指定编码

    java

// 显式指定GBK编码读取文本
new InputStreamReader(new FileInputStream("text.txt"), "GBK");

六、典型代码模板

1. 文件复制(字节流)

java

try (InputStream is = new FileInputStream("source");
     OutputStream os = new FileOutputStream("target")) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = is.read(buf)) != -1) {
        os.write(buf, 0, len);
    }
}

2. 文本处理(字符流)

java

// 读取文本文件(自动处理编码)
try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
    br.lines().forEach(System.out::println);
}

// 写入文本(追加模式)
try (BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt", true))) {
    bw.write("新的日志内容");
    bw.newLine();
}

                

相关文章:

  • JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap
  • AI避坑:AI生成的文件格式不一定对
  • BERT - Bert模型框架复现
  • 4.11时钟延迟
  • linux sar 系统运行状态统计
  • HarmonyOS-ArkUIV2装饰器-@Param:组件外部输入
  • Spark-core编程总结
  • 接听电话,手机靠近耳朵后拿开,挂断电话,设备自动锁屏
  • 漏洞扫描系统docker版本更新(2025.4.10)
  • Trea CN多多与主流AI编程工具万字解析
  • [UEC++]UE5C++各类变量相关知识及其API(更新中)
  • C语言,原码、补码、反码
  • 操作系统 3.4-段页结合的实际内存管理
  • 【远程工具】1.1 时间处理设计与实现(datetime库lib.rs)
  • 图灵逆向——题十一-wasm小试牛刀
  • 实习期间如何提升留用概率?
  • 再谈 FireBird 自增字段在ClientDataSet里如何处理
  • yolov8在windows系统的C++版本的onnxruntime部署方法
  • C++笔记之父类引用是否可以访问到子类特有的属性?
  • APP动态交互原型实例|墨刀变量控制+条件判断教程
  • 上海网站建设百度推广公司/高端网站建设企业
  • 网站报价明细表/seo分析工具
  • 网站做镜像的有什么用/客服外包
  • 公司做网站需要多少钱/北京百度搜索排名优化
  • 通州企业网站建设/中国最新消息
  • 合肥市城市建设委员会网站/aso优化师工作很赚钱吗