java IO/NIO/AIO

(✪▽✪)曼波~~~~!让曼波用最可爱的赛马娘方式给你讲解吧!(⁄ ⁄•⁄ω⁄•⁄ ⁄)

🎠曼波思维导图大冲刺(先看框架再看细节哦):

📚

解释 Java 中 IO、NIO、AIO 的区别和适用场景:

曼波觉得Java的三种IO家族是这样的哦(๑˃̵ᴗ˂̵)و

java 复制代码
// 传统IO示例(阻塞式)
FileInputStream fis = new FileInputStream("test.txt");  // 会阻塞线程直到读取完成
int data = fis.read();

// NIO示例(非阻塞)
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);  // 设置为非阻塞模式
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);  // 立即返回,可能读到0字节

// AIO示例(异步)
AsynchronousFileChannel afc = AsynchronousFileChannel.open(Paths.get("test.txt"));
afc.read(buffer, 0, null, new CompletionHandler<>() {  // 回调函数
    public void completed(Integer result, Object attachment) {
        // 读取完成自动调用
    }
});

(✪▽✪)曼波~~ 区别总结表:

IO NIO AIO
模型 阻塞 非阻塞 异步
线程消耗
适用场景 小文件 高并发 大文件
复杂度 较高

📡

在 NIO 中,Selector 的作用是什么,如何使用它实现多路复用?

哦呜(°ロ°)!NIO的Selector就像赛马场的总控台呢!看曼波用代码演示:

java 复制代码
Selector selector = Selector.open();
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.register(selector, SelectionKey.OP_ACCEPT);  // 注册关注的事件

while(true) {
    int readyChannels = selector.select();  // 等待事件发生
    if(readyChannels == 0) continue;
    
    Set<SelectionKey> keys = selector.selectedKeys();
    for(SelectionKey key : keys){
        if(key.isAcceptable()) {  // 有新连接
            // 处理接受连接
        } else if(key.isReadable()) {  // 可读事件
            // 处理读操作
        }
    }
    keys.clear();  // 清空处理完的key
}

(✪▽✪)曼波~~ 多路复用就像同时监控多匹赛马的状态,一个驯马师(线程)就能管理整个马场!

🚀

请说明在高并发网络编程中,AIO 相较于 NIO 的优势。

曼波觉得AIO的优势就像自动喂马机呢(≧ω≦)/

  • NIO需要主动查看每个马厩(轮询)
  • AIO马儿饿了会自己按铃(回调通知)
java 复制代码
// AIO服务端示例
AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open();
server.bind(new InetSocketAddress(8888));

// 异步接受连接
server.accept(null, new CompletionHandler<>() {
    public void completed(AsynchronousSocketChannel client, Object attachment) {
        // 自动处理新连接
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        client.read(buffer, null, new CompletionHandler<>(){/* 读完成回调 */});
    }
});

优势总结:

  1. 完全异步避免线程阻塞
  2. 回调机制减少线程切换
  3. 适合处理耗时长的I/O操作(比如大文件传输)

(✪▽✪)曼波~~~~!最后给备考的小建议:

  • 面试时要举实际场景例子(比如聊天室用NIO,视频传输用AIO)
  • 记得区分同步/异步与阻塞/非阻塞的区别
  • 画图说明Selector工作原理会加分哦!

需要曼波用更可爱的比喻再解释哪里吗?(*≧ω≦) 随时可以问哦!

相关推荐
RainbowSea13 分钟前
6-2 MySQL 数据结构选择的合理性
java·后端·mysql
androidwork17 分钟前
Fragment事务commit与commitNow区别
android·java·kotlin
哆啦A梦的口袋呀22 分钟前
基于Python学习《Head First设计模式》 第一章 策略模式
python·学习·设计模式
WispX8881 小时前
【手写系列】手写 AQS 实现 MyLock
java·开发语言·并发·aqs··手写·lock
初叶 crmeb1 小时前
JAVA单商户易联云小票打印替换模板
java·linux·python
Mi Manchi261 小时前
力扣热题100之对称二叉树
python·算法·leetcode
RainbowSea1 小时前
秒杀/高并发解决方案+落地实现 (技术栈: SpringBoot+Mysql + Redis +RabbitMQ +MyBatis-Plus +Maven-5
java·spring boot·分布式
汤姆yu1 小时前
基于springboot的民间文化艺术品销售系统
java·spring boot·后端
二进制小甜豆1 小时前
Spring MVC
java·后端·spring·mvc
Yvonne9781 小时前
定时任务:springboot集成xxl-job-core(一)
java·spring boot·xxl-job