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

Java NIO系列教程(一) Java NIO 概述

原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一

Java NIO 由以下几个核心部分组成:

  • Channels
  • Buffers
  • Selectors

虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。

 

Channel 和 Buffer

基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。这里有个图示:

Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

正如你所看到的,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。

与这些类一起的有一些有趣的接口,但为简单起见,我尽量在概述中不提到它们。本教程其它章节与它们相关的地方我会进行解释。

以下是Java NIO里关键的Buffer实现:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。

Java NIO 还有个 MappedByteBuffer,用于表示内存映射文件, 我也不打算在概述中说明。

Selector

Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。

这是在一个单线程中使用一个Selector处理3个Channel的图示:

要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java NIO系列教程(一) Java NIO 概述

转载于:https://www.cnblogs.com/dassmeta/p/5328729.html

相关文章:

  • function name address vs array name address
  • 关于加载本地加载ga.js文件的问题
  • Jdev Run Page 没有反应
  • spring3 的restful API RequestMapping介绍
  • SQL数据库还原时备份集中的数据库备份与现有的数据库不同的解决办法
  • 单元测试
  • 我理解的--java门面模式
  • yii create url (一)
  • Android MediaPlayer Error/Info Code
  • Nginx服务器防止负载过高模块sysguard
  • 矩阵的存储及快速转置
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]
  • USB2.0学习笔记连载(九):USB设备驱动的安装
  • PHP语言 -- 面向对象
  • spring 中IOC和aop的理解
  • Django 博客开发教程 8 - 博客文章详情页
  • ES10 特性的完整指南
  • ES6系列(二)变量的解构赋值
  • Gradle 5.0 正式版发布
  • Java程序员幽默爆笑锦集
  • jdbc就是这么简单
  • js数组之filter
  • Material Design
  • Mithril.js 入门介绍
  • Python3爬取英雄联盟英雄皮肤大图
  • Python语法速览与机器学习开发环境搭建
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • webpack+react项目初体验——记录我的webpack环境配置
  • 半理解系列--Promise的进化史
  • 关于 Cirru Editor 存储格式
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 算法-插入排序
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #define 用法
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $NOIp2018$劝退记
  • (4)STL算法之比较
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Forward) Music Player: From UI Proposal to Code
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (六)vue-router+UI组件库
  • (南京观海微电子)——COF介绍
  • (排序详解之 堆排序)
  • (转)iOS字体
  • .jks文件(JAVA KeyStore)
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net流程开发平台的一些难点(1)
  • .NET应用架构设计:原则、模式与实践 目录预览