Java中处理I/O操作的不同方式:BIO,NIO,AIO

Java中处理I/O操作的不同方式:BIO,NIO,AIO

在这里插入图片描述

亲爱的朋友,

在这美好的时刻,愿你感受到生活的温暖和欢乐。愿你的每一天都充满着笑容和满足,无论面对什么挑战都能勇往直前,化解困境。

希望你的心中充满爱和被爱的力量,与亲人朋友分享彼此的喜悦与快乐。愿你的努力与付出都得到应有的回报,让生活的经历变成丰富的财富。

愿你的每一个愿望都能如期实现,每一份期待都能变成美好的现实。愿你的未来充满惊喜和憧憬,而每一天都是属于你独一无二的精彩故事。

祝福你生活美满,前程似锦,充满阳光和希望!

首先,我们需要知道,Java中处理I/O操作的不同方式的不同方式有几种。

BIO、NIO和AIO是Java中处理I/O操作的三种不同方式,它们分别代表阻塞I/O、非阻塞I/O和异步I/O。下面是对它们的详细介绍,在这里我们结合代码进行一个综合演示,代码由于是伪代码,可能存在不足,仅供大家参考:

  1. BIO(Blocking I/O)阻塞I/O:

    • 特点: 在阻塞I/O中,当一个线程在进行I/O操作时,它会被阻塞,直到操作完成。这意味着当一个线程在读取或写入数据时,它无法执行其他任务,直到I/O操作完成。

    • 适用场景: 适用于连接数较少且连接时间较长的情况,例如传统的Socket编程。

    • 代码演示:

      import java.io.IOException;
      import java.io.InputStream;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      public class BlockingIOServer {
          public static void main(String[] args) throws IOException {
              ServerSocket serverSocket = new ServerSocket(8888);
      
              while (true) {
                  Socket clientSocket = serverSocket.accept(); // 阻塞等待客户端连接
                  InputStream inputStream = clientSocket.getInputStream();
                  // 处理输入流,阻塞直到数据可读
                  int data = inputStream.read();
                  System.out.println("Received data: " + data);
      
                  // 其他业务逻辑处理
              }
          }
      }
      
  2. NIO(Non-blocking I/O)非阻塞I/O:

    • 特点: NIO引入了通道(Channel)和缓冲区(Buffer)的概念,以及选择器(Selector)来实现非阻塞I/O。在非阻塞I/O中,一个线程可以管理多个通道,通过选择器监视这些通道的状态,当一个通道可读或可写时,线程可以切换到其他任务,而不需要等待I/O操作完成。

    • 适用场景: 适用于连接数较多但每个连接的交互时间短的情况,例如网络编程中的聊天室。

    • 代码演示:

      import java.io.IOException;
      import java.net.InetSocketAddress;
      import java.nio.ByteBuffer;
      import java.nio.channels.SelectionKey;
      import java.nio.channels.Selector;
      import java.nio.channels.ServerSocketChannel;
      import java.nio.channels.SocketChannel;
      import java.util.Iterator;
      import java.util.Set;
      
      public class NonBlockingIOServer {
          public static void main(String[] args) throws IOException {
              ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
              serverSocketChannel.bind(new InetSocketAddress(8888));
              serverSocketChannel.configureBlocking(false);
      
              Selector selector = Selector.open();
              serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
      
              while (true) {
                  selector.select();
                  Set<SelectionKey> selectedKeys = selector.selectedKeys();
                  Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
      
                  while (keyIterator.hasNext()) {
                      SelectionKey key = keyIterator.next();
      
                      if (key.isAcceptable()) {
                          // 处理连接
                          SocketChannel clientChannel = serverSocketChannel.accept();
                          clientChannel.configureBlocking(false);
                          clientChannel.register(selector, SelectionKey.OP_READ);
                      } else if (key.isReadable()) {
                          // 处理读事件
                          SocketChannel clientChannel = (SocketChannel) key.channel();
                          ByteBuffer buffer = ByteBuffer.allocate(1024);
                          int bytesRead = clientChannel.read(buffer);
                          System.out.println("Received data: " + new String(buffer.array(), 0, bytesRead));
      
                          // 其他业务逻辑处理
      
                          clientChannel.close();
                      }
      
                      keyIterator.remove();
                  }
              }
          }
      }
      
      
  3. AIO(Asynchronous I/O)异步I/O:

    • 特点: AIO引入了异步I/O操作,其中读/写请求被提交给操作系统,而应用程序继续执行其他任务。当操作系统完成I/O操作时,会通知应用程序,这样就实现了异步的I/O操作。

    • 适用场景: 适用于连接数较多且每个连接的交互时间不确定的情况,例如在高并发的网络服务器中。

    • 代码演示:

      import java.io.IOException;
      import java.net.InetSocketAddress;
      import java.nio.ByteBuffer;
      import java.nio.channels.AsynchronousServerSocketChannel;
      import java.nio.channels.AsynchronousSocketChannel;
      import java.nio.channels.CompletionHandler;
      
      public class AsyncIOServer {
          public static void main(String[] args) throws IOException {
              AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
              serverSocketChannel.bind(new InetSocketAddress(8888));
      
              serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
                  @Override
                  public void completed(AsynchronousSocketChannel clientChannel, Void attachment) {
                      serverSocketChannel.accept(null, this);
                      // 继续接收下一个连接
                      ByteBuffer buffer = ByteBuffer.allocate(1024);
                      clientChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
                          @Override
                          public void completed(Integer bytesRead, ByteBuffer buffer) {
                              System.out.println("Received data: " + new String(buffer.array(), 0, bytesRead));
                              // 其他业务逻辑处理
                              clientChannel.close();
                          }
      
                          @Override
                          public void failed(Throwable exc, ByteBuffer buffer) {
                              // 处理读取失败
                          }
                      });
                  }
      
                  @Override
                  public void failed(Throwable exc, Void attachment) {
                      // 处理接受连接失败
                  }
              });
      
              // 阻塞主线程,保持服务端运行
              try {
                  Thread.sleep(Integer.MAX_VALUE);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
      
      

总的来说,BIO适用于连接数较少且连接时间较长的场景,NIO适用于连接数较多但每个连接的交互时间短的场景,而AIO适用于连接数较多且每个连接的交互时间不确定的场景。选择合适的I/O模型取决于具体的应用需求。在Java中,NIO和AIO是在Java 1.4 和 Java 7 中引入的,分别位于java.niojava.nio.channels包中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/383048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu22.04 安装部署04:经常死机,鼠标,键盘无响应

相关文章&#xff1a; ubuntu22.04 安装部署01&#xff1a;禁用内核更新 ubuntu22.04安装部署02&#xff1a;禁用显卡更新 ubuntu22.04安装部署03&#xff1a; 设置root密码 一、现象说明 1. 开机一小时后&#xff0c;突然之间网络掉线&#xff0c;鼠标、键盘无反应。 2.…

Makefile编译原理 make 中的路径搜索_2

一.make中的路径搜索 VPATH变量和vpath关键字同时指定搜索路径。 实验1 VPATH 和 vpath 同时指定搜索路径 mhrubuntu:~/work/makefile1/18$ tree . ├── inc │ └── func.h ├── main.c ├── makefile ├── src1 │ └── func.c └── src2 └── func.c mak…

面向对象编程:理解其核心概念与应用

引言 在编程的世界中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;已成为一种主流的编程范式。它提供了一种组织和管理代码的有效方式&#xff0c;使得代码更加模块化、可重用和易于维护。本文将带您深入探讨面向对象编程的核心概念及其…

mysql、mybatis中SORT

SORT排序 根据数据表sys_series中HOT(int类型)进行升序排列: 原来的数据库中存储: 排序# 结果是HOT字段为null的所有数据都排在最前面,不为null的数据按升序排列 SELECT * FROM sys_series ORDER BY HOT;# 结果是HOT字段为null的所有数据都排在最后面,不为null的数据按数…

测试编码规范

0.测试代码和业务代码要分离 把测试代码和业务代码放进各自的所属的"盒子"中&#xff0c;互不干扰 Q:为什么要分离? 分门别类&#xff0c;避免混乱&#xff0c;方便维护 不在试卷上打草稿而是专门准备草稿纸 没人会在客厅做饭吧&#xff0c;不然要厨房干什么 Q:如…

uv机器电机方向极性

爱普生主板设置X、Y 电机方向极性&#xff1a;请根据实际情况设置&#xff0c;开机初始化时如果电机运动方向反了则修改此极性。 理光主板设置X、Y 电机方向极性

Netty应用(七) 之 Handler Netty服务端编程总结

目录 15.Handler 15.1 handler的分类 15.1.1 按照方向划分 15.1.2 handler的结构 15.2 输入方向ChannelInboundHandlerAdapter 15.2.1 输出方向Handler的顺序 15.2.2 多个输入方向Handler之间的数据传递 15.2.2.1 handler消失了 15.2.2.2 手动编写netty提供的new Strin…

第66讲管理员登录功能实现

项目样式初始化 放assets目录下&#xff1b; border.css charset "utf-8"; .border, .border-top, .border-right, .border-bottom, .border-left, .border-topbottom, .border-rightleft, .border-topleft, .border-rightbottom, .border-topright, .border-botto…

Day39- 动态规划part07

一、爬楼梯 题目一&#xff1a;57. 爬楼梯 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;…

2024给你一些Android 应用性能优化的建议

2024给你一些Android 应用性能优化的建议 在当今激烈竞争的移动应用市场中&#xff0c;用户对应用性能和体验的要求越来越高。因此&#xff0c;进行 Android 应用性能优化是开发过程中必不可少的一环。下面将详细介绍如何提升应用的性能&#xff0c;以提升用户体验。 1. 优化…

LSF 主机状态 unreach 分析

在LSF集群运行过程中&#xff0c;有主机状态变为 unreach。熟悉LSF的朋友都知道主机状态为 unreach 表示主机上的 SBD 服务中断服务了&#xff0c;但其它服务 LIM 和 RES 还在正常运行。 影响分析 那么主机上的 SBD 服务中断的影响是什么呢&#xff1f; 我们需要先明白 SBD …

Swift Combine 使用 sink, assign 创建一个订阅者 从入门到精通九

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

算法学习——LeetCode力扣二叉树篇2

算法学习——LeetCode力扣二叉树篇2 107. 二叉树的层序遍历 II 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#…

nginx简单配置四种携带/时的拼接关系

一、代理静态文件 1、 当 location 尾部有 /&#xff0c;且代理地址尾部也有 / 时&#xff1a;&#xff08;常用&#xff09; location /test11/ {root /usr/local/nginx/html/; } 则访问 http://ip/test11/aaa&#xff0c;实际访问的是/usr/local/nginx/html/aaa2、 当…

CSS Selector—选择方法,和html自动——异步社区的爬取(动态网页)——爬虫(get和post的区别)

这里先说一下GET请求和POST请求&#xff1a; post我们平时是要加data的也就是信息&#xff0c;你会发现我们平时百度之类的 搜索都是post请求 get我们带的是params&#xff0c;是发送我们指定的内容。 要注意是get和post请求&#xff01;&#xff01;&#xff01; 先说一下异…

【Yi-VL-34B】(5):使用3个3090显卡24G版本,运行Yi-VL-34B模型,支持命令行和web界面方式,理解图片的内容转换成文字

1&#xff0c;视频地址 https://www.bilibili.com/video/BV1BB421z7oA/ Yi-VL-34B&#xff08;5&#xff09;&#xff1a;使用3个3090显卡24G版本&#xff0c;运行Yi-VL-34B模型&#xff0c;支持命令行和web界面方式&#xff0c;理解图片的内容转换成文字 2&#xff0c;关于Yi…

超详细测试项目——Web电商项目测试点整理.....

虽然说近些年来&#xff0c;软件测试找工作的时候&#xff0c;简历中如果写着电商项目被认为是烂大街的项目&#xff0c;甚至受到根本不了解行情的HR或者部分公司的技术人员的刁难&#xff0c;但是&#xff1a;电商这么流行普遍的项目和应用&#xff0c;这不是很正常么&#xf…

[职场] 面试被问优点的回答参考 #知识分享#其他#学习方法

面试被问优点的回答参考 当面试官问你最大的优点是什么&#xff1f;回答1&#xff1a; 我擅长合理地安排时间&#xff0c; 作为助理&#xff0c; 我的杂事很多&#xff0c; 总是觉得手边有做不完的事情&#xff0c; 所以我特别注意时间管理&#xff0c; 这样才能高效地工作&am…

【java】Hibernate访问数据库

一、Hibernate访问数据库案例 Hibernate 是一个在 Java 社区广泛使用的对象关系映射&#xff08;ORM&#xff09;工具。它简化了 Java 应用程序中数据库操作的复杂性&#xff0c;并提供了一个框架&#xff0c;用于将对象模型数据映射到传统的关系型数据库。下面是一个简单的使…

Leecode之环形链表进阶

一.题目及剖析 https://leetcode.cn/problems/linked-list-cycle-ii/description/ 这道题就是找到链表中环的入口 二.思路引入 假设起点到环的入口的距离为L, 环的长度为C, 入口到相遇点的距离为C - N 设定一个快慢指针,速度分别为2, 1 则有 (L kC - N) 2*(L C - N) 即…