Java IO流

Java IO流:核心概念、使用场景与代码示例

Java IO流是处理输入/输出的核心机制,基于装饰器模式设计,支持灵活组合。以下内容结合核心概念、使用场景及真实代码示例,涵盖字节流、字符流、缓冲流等关键组件。


一、Java IO流分类与使用场景

分类核心类使用场景特点
字节流InputStream/OutputStream二进制文件(图片、视频、压缩包)以字节为单位操作,不处理编码
字符流Reader/Writer文本文件(.txt、.csv、日志)以字符为单位,自动处理编码(如UTF-8)
缓冲流BufferedInputStream大文件读写、高频I/O操作减少磁盘I/O次数,提升性能
转换流InputStreamReader/OutputStreamWriter字节流与字符流的桥梁可指定字符编码(如StandardCharsets.UTF_8
对象流ObjectInputStream/ObjectOutputStream序列化对象存储或传输需实现Serializable接口

选择原则

  • 二进制数据 → 字节流
  • 文本数据 → 字符流(优先用缓冲流包装)
  • 跨编码场景 → 转换流

二、核心类使用示例

1. 字节流读写文件(二进制操作)
import java.io.*;

public class ByteStreamDemo {
    public static void main(String[] args) {
        // 使用try-with-resources自动关闭流(避免内存泄漏)
        try (FileInputStream fis = new FileInputStream("input.jpg");
             FileOutputStream fos = new FileOutputStream("output.jpg")) {
            
            byte[] buffer = new byte[8192];  // 8KB缓冲区(优化性能)
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);  // 写入读取的字节
            }
            System.out.println("文件复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 场景:图片/视频复制
  • 优化点:缓冲区设为8192字节(磁盘块大小倍数)减少I/O次数
2. 字符流读写文本(带缓冲)
import java.io.*;
import java.nio.charset.StandardCharsets;

public class CharStreamDemo {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                    new FileInputStream("input.txt"), StandardCharsets.UTF_8));  // 指定UTF-8编码
             BufferedWriter writer = new BufferedWriter(
                new FileWriter("output.txt"))) {
            
            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);  // 逐行读写
                writer.newLine();    // 换行符适配操作系统
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 场景:日志文件处理、CSV解析
  • 关键点
    • BufferedReader加速读取(readLine()效率高)
    • 指定编码避免乱码(StandardCharsets.UTF_8
3. 对象序列化与反序列化
import java.io.*;

class User implements Serializable {  // 必须实现Serializable
    private String name;
    public User(String name) { this.name = name; }
    @Override
    public String toString() { return "User: " + name; }
}

public class ObjectStreamDemo {
    public static void main(String[] args) {
        // 序列化对象到文件
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("user.dat"))) {
            oos.writeObject(new User("Alice"));
        } catch (IOException e) { e.printStackTrace(); }

        // 从文件反序列化对象
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("user.dat"))) {
            User user = (User) ois.readObject();
            System.out.println(user);  // 输出: User: Alice
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  • 场景:分布式系统数据传输、缓存存储

三、性能优化与问题解决

大文件处理问题
问题解决方案
内存溢出(OOM)分块读取(固定缓冲区) + 流式处理
读写速度慢使用BufferedInputStream/BufferedOutputStream
字符编码不一致InputStreamReader显式指定编码

优化示例(分块读取10GB文件):

byte[] buffer = new byte[8192];  // 8KB缓冲区
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
    // 处理每个分块(避免全加载到内存)
}
避免资源泄漏
  • 必须关闭流!推荐 try-with-resources(Java 7+):
    try (InputStream is = new FileInputStream("file")) {
        // 操作流
    }  // 自动调用close()
    

四、Java IO vs. NIO

特性Java IOJava NIO
数据单位流(Stream)块(Buffer) + 通道(Channel)
阻塞模式阻塞I/O(线程等待)非阻塞/选择器(Selector)
适用场景低并发、简单文件操作高并发网络应用(如聊天服务器)

NIO示例场景:需同时处理数千连接的Web服务器。

思维导图

Java IO流

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值