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

news2024/9/20 22:49:16

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包中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode:26.删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 思路&#xff1a; 代码注释&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路&#xff1a; 没啥特殊的&#xff0c;老老实实双指针遍历数组&#xff0c;&#xff0…

2024.2.6日总结(小程序开发3)

页面配置 页面配置和全局配置的关系&#xff1a; 小程序中&#xff0c;app.json中的window节点&#xff0c;可以全局配置小程序中每个页面的窗口表现 如果某些小程序想要有特殊的窗口表现&#xff0c;可以用页面级别的.json配置文件实现这个需求 页面配置和全局配置冲突时&…

企业计算机服务器中了mallox勒索病毒怎么办,mallox勒索病毒处理流程

由于网络技术的不断发展与应用&#xff0c;越来越多的企业开始依赖计算机技术来提高企业效率。然而&#xff0c;网络安全威胁无处不在&#xff0c;严重影响着企业计算机服务器中的数据安全。近期&#xff0c;云天数据恢复中心接到许多中大型企业的求助&#xff0c;企业的多台服…

国产数据库 GBase 8a 安装

一、GBase简介 GBase 是南大通用数据技术有限公司推出的自主品牌的数据库产品&#xff0c;在国内数据库市场具有较高的品牌知名度。 二、下载地址&#xff08;需要先注册账号&#xff09; https://www.gbase.cn/download/gbase-8a?categoryINSTALL_PACKAGE 三、环境 服务…

Python(20)正则表达式(Regular Expression)中常用函数用法

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 正文 正则表达式 粗略的定义&#xff1a;正则表达式是一个特殊的字符序列&#xff0c;帮助用户非常便捷的检查一个字符串是否符合某种模…

小白代码审计入门

最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是着恰恰应了一句老话:万事开头难。但是小白我会坚持下去。何况现在已经喜欢上了代码审计,下面呢小白就说一下appcms后台模板Getshell以及读取任意文件,影响的版本是2.0.101版本。…

vue项目开发vscode配置

配置代码片段 步骤如下&#xff1a; 文件->首选项->配置用户代码片段新增全局代码片段起全局代码片段文件名“xxx.code-snippets” 这里以配置vue2初始代码片段为例&#xff0c;配置具体代码片段 {"name": "vue-sph","version": "…

【Qt】常见问题

1.存在未解析的标识符 将build文件夹删掉重新编译。 2.左侧项目目录栏无法删除已添加项目 打开目标项目上一级的pro文件&#xff0c;将目标文件名字注释或者删除掉&#xff0c;最后保存&#xff0c;qt就会自动更新&#xff0c;将该项目隐藏掉。 3.在qt creator下添加槽函数…

MATLAB语音去噪系统

目录 一、背景 二、GUI页面 三、程序 3.1 LMS滤波程序 3.2 GUI程序 四、附录 一、背景 本文介绍了一种最佳的自适应滤波器结构&#xff0c;该结构采用最小均方差&#xff08;LMS&#xff09;作为判据&#xff0c;通过不断迭代自适应结构来调整得到最佳滤波器…

Linux应用开发---网络通信

Linux应用开发—网络通信 1 网络通信概述 Linux下的网络编程&#xff0c;我们一般称为 socket 编程&#xff0c;socket 是内核向应用层提供的一套网络编程接口&#xff0c;我们可以基于socket接口开发自己的网络相关应用程序。 1.1 socket 简介 套接字&#xff08;socket&…

在容器中使用buildah构建镜像

简介 buildah是一个构建OCI标准镜像的工具&#xff0c;可以用来替代docker build 在常见的linux发行版中可直接通过包管理工具安装使用 # centos yum install buildah# ubuntu/debian apt install buildah# alpine apk add buildah其他发行版安装方法详见 github&#xff0c…

RabbitMQ-4.MQ的可靠性

MQ的可靠性 4.MQ的可靠性4.1.数据持久化4.1.1.交换机持久化4.1.2.队列持久化4.1.3.消息持久化 4.2.LazyQueue4.2.1.控制台配置Lazy模式4.2.2.代码配置Lazy模式4.2.3.更新已有队列为lazy模式 4.MQ的可靠性 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消…

(每日持续更新)jdk api之ObjectInputFilter.FilterInfo基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

RabiitMQ延迟队列(死信交换机)

Dead Letter Exchange&#xff08;死信交换机&#xff09; 在MQ中&#xff0c;当消息成为死信&#xff08;Dead message 死掉的信息&#xff09;后&#xff0c;消息中间件可以将其从当前队列发送到另一个队列中&#xff0c;这个队列就是死信队列。而 在RabbitMQ中&#xff0c;由…

dolphinscheduler海豚调度(一)简介快速体验

1、简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系&#xff0c;并为应…

Doris中的本地routineload环境,用于开发回归测试用例

----------------2024-2-6-更新-------------- doris的routineload&#xff0c;就是从kafka中加载数据到表&#xff0c;特点是定时、周期性的从kafka取数据。 要想在本地开发测试routine load相关功能&#xff0c;需要配置kafka环境&#xff0c;尤其是需要增加routine load回…

SQL,HQL刷题,尚硅谷

目录 相关表数据&#xff1a; 题目及思路解析&#xff1a; 汇总分析 1、查询编号为“02”的课程的总成绩 2、查询参加考试的学生个数 分组 1、查询各科成绩最高和最低的分&#xff0c;以如下的形式显示&#xff1a;课程号&#xff0c;最高分&#xff0c;最低分 2、查询每门课程…

分享66个行业PPT,总有一款适合您

分享66个行业PPT&#xff0c;总有一款适合您 66个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1kcUOfR_xtH9CAJC12prcTw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知…

ABAP 获取屏幕字段值,field-symbols,assign..TO.. 相关知识实例

ABAP 获取屏幕字段值&#xff0c;field-symbols&#xff0c;assign..TO.. 相关知识实例 以QA32质量放行程序为例子&#xff1a; 由于这个两个值都在结构RQEVA中&#xff0c;为了方便这里获取整个结构值&#xff0c;最后利用指针指向这个程序的这个结构即可获取当前值&#xf…

小红的字符串中值

题目描述: 小红定义一个长度为奇数的字符串的“中值”为中间那个字符。例如"kou"的中值是o。 现在小红拿到了一个字符串&#xff0c;她想知道某个字符是多少个子串的中值。你能帮帮她吗&#xff1f; 输入描述: 输出描述: 一个整数&#xff0c;代表中值为chr的连续子串…