`

【Java核心-基础】IO

    博客分类:
  • Java
 
阅读更多

简述

Java 的 IO 方式大致可分为 3 类:BIO、NIO、NIO 2(AIO)

这 3 类 IO 方式在 同步/异步 和 阻塞/非阻塞 方面有明显区别。

同步 vs 异步

同步:后续任务必须等当前调用返回后再执行。

异步:后续任务不需要等待当前调用返回,依靠事件、回调等机制实现任务间次关系。

阻塞 vs 非阻塞

阻塞:执行阻塞操作时,当前线程会处于阻塞状态,无法执行其它任务,只有条件就绪后才能继续。

非阻塞:不管操作是否结束,当前线程直接返回,由后台其它线程继续处理。

 

 

BIO


 

BIO 指传统的 java.io 包,也包括 java.net 下的部分API(如,Socket、ServerSocket、HttpURLConnection)。

BIO 基于流模型,以同步、阻塞的方式交互(B:Blocking)。

优点:简单、直观

缺点:IO 效率 和 扩展性 存在局限性,容易成为性能瓶颈

 

  • InputStream / OutputStream 用于读写 字节
  • Reader / Writer 增加了编解码功能,用于读写 字符
  • BufferedInputStream / BufferedOutputStream 带缓存区,对批量数据进行一次操作,可以减少对磁盘等硬件的读写频率,提高IO效率
    写数据后需要 flush
  • Closeable 接口提供的 close() 方法可以释放相关资源
    如,释放 FileInputStream 所获取的文件描述符(FileDescriptor)
    可以利用 try-with-resourcestry-finally 机制来确保调用了 close()方法

 

NIO

Java 1.4 引入了 NIO
提供了 Channel、Selector、Buffer 等机制,可以构建多路复用、同步非阻塞的IO程序(N:New、Non-Blocking)。
它提供了更接近操作系统底层的高性能数据操作方式。
JDK 的这部分功能在不同操作系统上实现有较大不同,应在真实的运行环境上测试。如,开发环境是 Windows,部署环境是 Linux,则应以 Linux 环境的调试结果为准。

 

Java 1.7 引入了 NIO 2(AIO
提供了异步非阻塞的IO方式(A:Asynchronous)。

 

缺点:单个请求中数据量较大时,对后续事件的响应会被延迟。所以多路复用适用于大量请求大小有限的场景。

 

  • Buffer 是高效的数据容器
    除 boolean 外,所有原始数据类型都有相应的 Buffer 实现。
     
  • Channel 用于支持 批量 式 IO
    类似 Linux 上的文件描述符,比 File、Socket 更接近操作系统底层。
    Channel 可以充分利用操作系统底层机制,获得特定场景的性能优化。如,DMA(Direct Memory Access)。
     
  • Selector 用于支持 多路复用
    它可以监测到注册在 Selector 上的多个 Channel 中,是否有 Channel 处于就绪状态,实现单线程对多 Channel 的高效管理。
    针对不同操作系统,Selector 的实现了不同;Linux 上依赖于 Epoll;Windows 上依赖于 iocp

 

BIO 和 NIO 应用差异示例

此处以 Client-Server Socket 通信为例来说明 NIO 的应用差异。

 

用 BIO 实现

针对每个来自 Client 的请求,都创建一个对应线程执行,或交由线程池处理。

缺点:扩展性差。大量客户端请求时,产生大量连接,服务端对每个连接的处理需要线程上下文切换,开销过高。


 

ServerSocket serverSocket = new ServerSocket(80);
while (true) {
  Socket socket = serverSocket.accept();
  Thread requestHandler = new Thread(()->{
    // 处理来自客户端的请求(socket)
  });
  requestHandler.start();
}

 

用 NIO 实现

每一个来自 Client 的请求都被汇聚到 Selector,用单线程轮询定位就绪的 Channel,再处理相应的请求。
Selector 类似于一个 调度员

  • 同步:每个准备好的 channel 处理是依次进行的;
  • 非阻塞:不需要每个连接(channel)都有一个对应的线程在等它就绪 。
    只有 select 阶段是阻塞的,可以避免大量客户端连接导致线程频繁切换的问题。


 

示例代码只注册了一个 Channel。

真实应用中一般会创建 多个 Channel,注册到同一个 Selector,也就是 多路复用。

为了避免单个 Selector (单线程)执行监听任务成为瓶颈,也可以尝试用 多个 Selector

 

try (Selector selector = Selector.open();
    ServerSocketChannel socketChannel = ServerSocketChannel.open()) {
  socketChannel.bind(new InetSocketAddress(InetAddress.getLocalHost(), 80));
  socketChannel.configureBlocking(false);
  // 注册到 Selector,并说明关注点(accept)
  socketChannel.register(selector, SelectionKey.OP_ACCEPT);
  while (true) {
    selector.select(); // 等待就绪的 Channel(这是阻塞操作)
    Set selectionKeys = selector.selectedKeys();
    Iterator iter = selectionKeys.iterator();
    while (iter.hasNext()) {
      SelectionKey key = iter.next();
      // 处理请求
      ServerSocketChannel channel = (ServerSocketChannel)key.channel();
      ...
      iter.remove();
    }
  }
} catch (IOException e) {
  // 处理异常
}

 

用 AIO 实现

这只是个简单的示例,真实应用中会更复杂

try {
  AsynchronousServerSocketChannel asyncChannel
      = AsynchronousServerSocketChannel.open();
  asyncChannel.bind(new InetSocketAddress(InetAddress.getLocalHost(), 80));
  asyncChannel.accept(null,
      new CompletionHandler<AsynchronousSocketChannel, Void>() {
        @Override
        public void completed(AsynchronousSocketChannel result,
            Void attachment) {
          // 接收下一次连接
          asyncChannel.accept(null, this);
          // 处理本次连接
          ...
        }

        @Override
        public void failed(Throwable exc, Void attachement) {
          // 处理连接失败的情况
        }
      })
} catch (IOException e) {
  // 处理异常
}

 

  • 大小: 65.9 KB
  • 大小: 37.6 KB
  • 大小: 23.7 KB
分享到:
评论

相关推荐

    C#的WinForm开发框架源码 权限管理系统源码数据库 SQL2008源码类型 WinForm

    WinForm开发框架源码 权限管理系统源码 功能描述:01.登录界面 02.系统配置 03.申请账户 04.即时通讯 05.发送消息 06.广播消息 07.软件频道 - 内部通讯录 08.软件频道 - 名片管理 09.软件频道 - 代码生成器 10.系统后台管理 - 用户审核 11.系统后台管理 - 用户管理 12.系统后台管理 - 组织机构管理 13.系统后台管理 - 角色管理 14.系统后台管理 - 员工管理 15.系统后台管理 - 岗位管理 16.系统后台管理 - 用户权限设置 17.系统后台管理 - 角色权限设置 18.系统后台管理 - 组织机构权限设置 19.系统后台管理 - 菜单权限项设置 20.系统后台管理 - 选项管理 21.系统后台管理 - 序号(流水号)管理 22.系统后台管理 - 系统日志 - 按用户访问情况 23.系统后台管理 - 系统日志 - 按用户查询 24.系统后台管理 - 系统日志 - 按菜单查询 25.系统后台管理 - 系统日志 - 按日期查询 26.系统后台管理 - 系统日志 - 系统异常情况记

    超级常用的甘特图-项目管理.xlsx

    超级常用的甘特图-项目管理.xlsx

    【MRFO栅格地图】蝠鲼觅食算法MRFO栅格地图路径规划(目标函数:最短距离)【含Matlab源码 9168期】.mp4

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    .f2812.acid

    .f2812.acid

    沟通的人性之光——AI 难以取代的人际交流能力.pdf

    沟通的人性之光——AI 难以取代的人际交流能力.pdf

    (源码)基于SpringBoot和Redis的分布式数据访问系统.zip

    # 基于Spring Boot和Redis的分布式数据访问系统 ## 项目简介 本项目是一个基于Spring Boot和Redis的分布式数据访问系统,旨在提供高效、可靠的数据库访问和缓存管理功能。系统通过集成Spring Boot框架和Redis数据库,实现了对数据库的读写操作、数据分片、缓存管理等功能,适用于需要高性能和高可用性的分布式应用场景。 ## 项目的主要特性和功能 1. 数据库访问对象(DAO)基类提供通用的数据库访问对象基类,简化数据库操作的配置和管理。支持只读模式和分片数据源的配置。 2. 数据源上下文持有者管理和切换数据库连接,适用于数据库分片的环境。 3. 动态数据源管理实现多数据库的动态管理,支持切换数据库连接。 4. 数据库访问接口(DAO)定义了与数据库交互的基本操作,如增删改查等。 5. 读写分离提供只读和可写的数据访问对象,确保读操作和写操作在不同的环境中进行。

    cnpdf_down.php

    cnpdf_down.php

    25 机床主轴结构优化设计.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    一个用 Java 实现的贪吃蛇小游戏.zip

    简介这个资源是一个用Java实现的贪吃蛇小游戏,旨在帮助初学者和有经验的开发者学习和提升编程技能。项目基于Java Swing库开发,包含完整的源代码、资源文件和文档。通过本项目,学习者可以深入理解Java编程基础、面向对象设计、图形用户界面开发、事件处理机制和游戏逻辑开发等核心概念。该贪吃蛇项目经过严格测试,确保代码可以正常运行,并且已经通过了答辩评审,获得高分评价,证明了其质量和完成度。项目适合作为课程设计、毕业设计或自我提升的实践练习。通过分析与实践这个项目,用户可以加深对Java语言的理解,提高编程能力,并获得宝贵的软件开发经验。

    AI智能聊天小程序开源版本,目前支持对接阿里通义千问、百度千帆文心一言、讯飞星火大模型.

    AI智能聊天小程序开源版本,目前支持对接阿里通义千问、百度千帆文心一言、讯飞星火大模型. 基于ruoyi-vue-plus的java8版本,有一些优化改动,主要技术栈: 后端:springboot2.7.18、mybatisplus、mysql、redis web前端:vue2、element ui、markdown编辑器cherry-markdown 小程序:微信原生语法、vant ui组件

    24-5-1 轴系5(1)-圆锥滚子轴承寿命计算.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    课程设计-基于MATLAB的数字语音识别+项目源码+文档说明+课题介绍+GUI界面

    <项目介绍> - 在本次设计中,将运用到MATLAB平台来对语音信号进行处理及识别。通过ATLAB平台建立一个GUI界面,接着输入数字语音信号,对输入进行预处理及端点检测,提取特征参数(MFCC),形成参考模块。与参考模块进行DTW算法进行匹配,输出匹配后的识别结果。 所制作GUI界面,制作成一个九宫格界面,点击对应0-9十个数字,可以播放对应语音,并且显示路径,波形,和结果的文本输出。可以进行二次改造成,属于一串数字,如数字正确,则触发另一个界面GUI,实现发射端和接收端的对话 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 -----

    一阶倒立摆模型推理和matlab仿真

    一阶倒立摆模型推理和matlab仿真

    (源码)基于Arduino的汽车事故预警系统.zip

    # 基于Arduino的汽车事故预警系统 ## 项目简介 本项目旨在设计一个基于Arduino的汽车事故预警系统,通过实时监测汽车的振动和加速度数据,预测可能的事故并发出警报。系统利用Arduino板、Esp8266模块、ADXL345加速度计等硬件设备,并通过手机或电脑应用程序接收警报信息。 ## 项目的主要特性和功能 1. 实时数据监测系统能够实时监测汽车的振动和加速度数据。 2. 数据传输通过Esp8266模块将数据传输到手机或电脑应用程序。 3. 警报通知应用程序接收警报信息,提醒驾驶员可能发生的事故。 4. 调试与分析提供串口监视器读数功能,方便调试和数据分析。 ## 安装使用步骤 1. 准备硬件确保所有硬件设备(如Arduino板、Esp8266模块、ADXL345加速度计等)已准备齐全。 2. 硬件连接按照说明书正确连接硬件设备,并配置Arduino IDE环境。 3. 上传代码下载并上传源代码文件到Arduino板。

    (源码)基于Qt框架的兵棋进攻游戏系统.zip

    # 基于Qt框架的兵棋进攻游戏系统 ## 项目简介 本项目是一个兵棋进攻游戏系统,通过图形界面展示兵棋对战的过程。玩家通过操作棋子,克服障碍和防守点,将棋子移动到进攻目标区。游戏具有随机生成棋子和障碍物的功能,以及实时更新游戏界面的能力。玩家可以通过鼠标点击和移动来操作棋子,游戏简单易懂,充满挑战性和趣味性。 ## 项目的主要特性和功能 1. 图形界面通过Qt框架实现图形界面,展示游戏棋盘、棋子、障碍物、防守点和目标区域。 2. 游戏逻辑实现兵棋进攻的游戏逻辑,包括棋子的移动、攻击、生命值管理,以及游戏的胜负判断。 3. 随机生成随机生成棋子和障碍物的位置,增加游戏的随机性和挑战性。 4. 实时更新实时更新游戏界面,包括棋子的位置、生命值、子弹的更新等。 5. 用户交互处理鼠标按下事件,实现棋子的选中、移动、生命值更新等操作。 6. 防守点机制设置防守点,棋子进入攻击范围时,防守点会进行射击。 7. 胜负判断判断游戏是否胜利或失败,并显示相应的提示信息。

    2024116比亚迪张家口成焊新线RF01生产线项目PLC HMI屏幕程序 SEW IPOS SEWMoviDrive RFI

    2024116比亚迪张家口成焊新线RF01生产线项目PLC和HMI屏幕程序,SEW IPOS SEW_MoviDrive RFID读写 博途项目

    包含移植好的工程文件和开发资料

    正点原子lvgl开发资料

    24-5-3 轴系5(3)-深沟球轴承寿命计算.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    36-2 典型曲线拟合.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    yolo算法-面部表情数据集表达式数据集-390张图像带标签-愤怒-悲哀的-中立的-幸福的.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

Global site tag (gtag.js) - Google Analytics