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

Java IO精讲:从传统IO到NIO的深度探索

一、Java IO概述

Java IO(Input/Output) 是Java处理输入输出的核心API,涵盖文件操作、网络通信等场景。其发展分为三个阶段:

  • 传统IO (java.io):基于流模型,阻塞式处理
  • NIO (java.nio):New IO,支持非阻塞和缓冲通道
  • NIO2 (Java7+):增强异步文件操作

二、核心类与设计模式

1. 四大基类

类类型字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

2. 装饰器模式应用

通过组合增强流的功能:

// 示例:缓冲流加速读取
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}

三、字节流 vs 字符流

对比项字节流字符流
处理单位1字节 (8bit)Unicode字符 (2字节)
典型场景图片、视频等二进制文件文本文件
编码处理不自动处理编码自动处理字符编码转换

字符流正确用法示例:

// 明确指定字符编码
try (InputStreamReader isr = new InputStreamReader(
    new FileInputStream("file.txt"), StandardCharsets.UTF_8)) {
    // 读取操作
}

四、文件操作大全

1. 传统文件操作

// 创建文件对象
File file = new File("data.txt");

// 判断文件属性
if (file.exists() && file.isFile()) {
    System.out.println("文件大小: " + file.length() + " bytes");
}

2. NIO2新特性(Java7+)

Path path = Paths.get("data.txt");

// 一次性读取所有行
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);

// 遍历目录
try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("."))) {
    stream.forEach(System.out::println);
}

五、NIO核心三剑客

1. Buffer缓冲区

ByteBuffer buffer = ByteBuffer.allocate(1024);

// 写模式
buffer.put("Hello".getBytes());

// 切换读模式
buffer.flip();
while (buffer.hasRemaining()) {
    System.out.print((char) buffer.get());
}

2. Channel通道

try (FileChannel channel = FileChannel.open(Paths.get("data.txt"), 
    StandardOpenOption.READ)) {
    
    ByteBuffer buf = ByteBuffer.allocate(1024);
    while (channel.read(buf) > 0) {
        buf.flip();
        // 处理数据
        buf.clear();
    }
}

3. Selector多路复用

Selector selector = Selector.open();
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);

while (true) {
    int readyChannels = selector.select();
    if (readyChannels == 0) continue;
    
    Set<SelectionKey> keys = selector.selectedKeys();
    // 处理IO事件
}

六、性能优化实践

  1. 缓冲流选择:BufferedInputStream提升读取效率
  2. 内存映射文件:处理大文件时使用MappedByteBuffer
  3. 通道传输:FileChannel.transferTo()实现零拷贝

七、常见问题解答

Q:什么时候用NIO?

  • 需要处理成千上万连接时(如聊天服务器)
  • 要求低延迟和高吞吐量的场景
  • 需要非阻塞IO操作时

Q:序列化注意事项

class User implements Serializable {
    private static final long serialVersionUID = 1L; // 显式声明版本号
    private transient String password; // 敏感字段不序列化
}

八、总结与资源推荐

  • 传统IO:适合简单同步操作
  • NIO:适合高并发网络应用
  • NIO2:简化文件操作的最佳选择

相关文章:

  • Selenium之Actions事件
  • 达梦数据库-学习-18-ODBC数据源配置(Linux)
  • CCF CSP 第35次(2024.09)(2_字符串变换_C++)(哈希表+getline)
  • java常见线程安全实现方案
  • 05-RabbitMQ 面试题-mk
  • 电感、互感器、变压器和磁珠综合对比——《器件手册--电感/线圈/变压器/磁珠篇》
  • Python 嵌套结构的defaultdict介绍
  • 训练模型的方式的两种方式:图像描述(Image Captioning)和对比学习(Contrastive Learning)原理及区别
  • 关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例
  • 【25软考网工笔记】第二章 数据通信基础(2) 信道延迟计算
  • python利用open-cv和SSIM和特征值比较两个图片的相似性
  • JAVAEE(多线程)
  • 公路水运安全员,yyds!
  • (打卡)794. 高精度除法
  • js 效果展示 拿去练手
  • 大模型入门
  • Redis:线程模型
  • 小白学习java第12天:IO流之打印流、数据流、IO框架
  • Spark-core编程(三)
  • Redis与Caffeine的结合使用详解(高效的二级缓存解决方案)
  • 一个网站 二级域名/外贸推广渠道有哪些
  • 做网购网站应该注意什么/百度贴吧官网网页
  • 网站内容与标题的区别/百度一下你就知道移动首页
  • wordpress和betheme/安徽seo网络推广
  • 常德网站建设求职简历/百度发广告需要多少钱
  • 上海opencart网站建设/网站推广的具体方案