java NIO详解(1)--概念及核心组件

快速了解Java中NIO核心组件 主要介绍了快速了解Java中NIO核心组件,涉及相关介绍及完整实例,具有一定借鉴价值,需要的朋友可以参考下。 立即下载

1. 组成

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

  • Channels
  • Buffers
  • Selectors

虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。

1.1 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,用于表示内存映射文件, 我也不打算在概述中说明。

1.2 Selector

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

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

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

2. 组件示例

Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。

2.1 Channel的实现

这些是Java NIO中最重要的通道的实现:

  • FileChannel: 从文件中读写数据。
  • DatagramChannel:能通过UDP读写网络中的数据。
  • SocketChannel:能通过TCP读写网络中的数据。
  • ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
2.2 基本的 Channel 示例

下面是一个使用FileChannel读取数据到Buffer中的示例:

public static void main(String[] args) throws Exception {
	RandomAccessFile aFile = new RandomAccessFile("nio-data.txt", "rw");
	FileChannel inChannel = aFile.getChannel();

	ByteBuffer buf = ByteBuffer.allocate(48);

	int bytesRead = inChannel.read(buf);
	while (bytesRead != -1) {

	    System.out.println("Read " + bytesRead);
	    buf.flip();

	    while(buf.hasRemaining()){
	        System.out.print((char) buf.get());
	    }

	    buf.clear();
	    bytesRead = inChannel.read(buf);
	}
	aFile.close();
}
/*****结果打印文件中的内容*****/
Read 8
nio test

/*****当内容过多时*****/
Read 48
0123456789
0123456789
0123456789
0123456789
Read 10
0123456789

注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。

NAT反向代理技术的实现(外网访问内网) NAT反向代理技术的实现(外网访问内网)(版权所有,引用 请联系作者,注明出处) NAT技术是网络中的重要应用之一。当有一个场景:内网搭建了服务器,需要外网访问时,可以借助NAT映射来实现。如:单位建立了一个Web服务器,我们希望在员工回家之后,依然可以访问到它,那怎么实现呢? 下面的拓扑图,就用来示范这个应用反面场景的实现过程。 一、题目要求: 地址配置如图。使用静态路由: 1、配置右侧交换机2950T,实现单臂路由; 2、配置路由使网络连通; 3、配置NAT访问,实现外网对风网服务器的 阅读详情

相关推荐

移动硬盘报错0x80070570?5分钟搞定CHKDSK修复(附详细参数说明)

本文针对移动硬盘报错0x80070570问题,提供了详细的CHKDSK修复方法。通过5分钟核心修复流程,指导用户使用系统自带工具快速修复文件系统逻辑错误,恢复硬盘访问。文章还深入解析了CHKDSK参数,并提供了备选数据恢复方案与日常防护建议。

app77的博客 233

NIO三大核心组件

三大组件的介绍 1、Buffer(缓冲区) 用于存储数据,底层是一个数组 拥有三个核心属性:capacity、limit、position capacity:数组的长度,意为缓冲区的总大小 limit:可读/可写的的长度 position:即将写入或者写出的下一个数据的位置 之间的大小关系为 position <= limit <= capacity 2、Channel(通道) 一个io操作的通信桥梁,起到连接作用,io操作并不直接对buffer进行数据的交换,必须通过Channel进行读/写

qq_44807343的博客 739

【嵌入式】树莓派部署NCNN的YOLOv5模型

树莓派部署NCNN框架的YOLOv5模型

Ace_Spade的博客 3781

NIO三大组件

目录 一、Buffer缓冲区 二、Channel通道 1.Channel和Stream的区别 2.Socketchannel 3.ServerSocketChannel 三、Selector选择器 四、NIO三大件的工作流程 提到NIO网络编程,就不得不提一下NIO中的三大组件:Buffer、Channel、Selector,JDK源码开发者在这里用了很通用形象的三个词语,去分别赋予三个类的抽象含义,Buffer即缓冲,Channel即管道,Selector为选择器,因为底层实现机制的复杂

半桶水的博客 2085

YOLOv11的嗅觉传感器数据关联-(特殊场景下的气味-视觉联合分析)

摘要 本文探讨了YOLOv11与嗅觉传感器融合的多模态感知技术。通过分析YOLOv11的架构特性与嗅觉传感器的数据特点,提出了三种融合策略:数据级、特征级和决策级融合。系统采用硬件同步方案实现时空对齐,包含视觉采集模块、嗅觉传感模块和边缘计算单元。环境配置基于Python 3.9和PyTorch 2.0,支持实时多模态数据处理。该技术可应用于环境监测、工业检测等场景,突破单一视觉感知的局限性。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 625

十七、SAP-采购订单(STO)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 2065

32. 数据结构-NIO简介及三大组件

数据结构-NIO,介绍了NIO的功能和三大组件,以及与BIO的区别 用于完成数据的传输 BIO - BlockingIO - 同步式阻塞式IO NIO - NonBlockingIO - 同步式非阻塞式IO - JDK1.4出现的 NIO三大组件:Buffer - 缓冲区,Channel - 通道,Selector - 选择器 二、NIO与BIO的比较 NIO是非阻塞的,BIO是阻塞的,所以效率上NIO要高一点 BIO完成一次读写过程要产生大量的流...

大头鱼 2908

ADC实现模数转换Multisim电路仿真——硬件工程师笔记

8位模数转换器(ADC)是将模拟信号转换为8位数字信号的电子器件,具有256级量化能力。其工作原理分为采样、量化和编码三个阶段,关键参数包括分辨率、采样率、精度、线性度和信噪比。常见型号有ADC0804、ADC0808等,广泛应用于数据采集、音频处理、通信系统和消费电子产品中。典型应用时需要配置参考电压、模拟输入和数字输出引脚,并通过仿真实验验证转换效果(如-10V对应输出0,10V对应255)。硬件工程师需掌握其原理和参数选择,相关笔试面试资料可在优快云博客获取。

XU157303764的博客 1507

NIO基础——三大组件

一、三大核心 NIO的三个最重要的核心分别为:Channel,Buffer和Selector。 1.Channel(通道) Channel就像是通道,是一个关于程序与操作系统底层I/O服务交互的通道。 比如:我们的程序对系统中某一个文件进行连接,以便于我们对它进行后续的操作。 常见的Channel有以下四种: FileChannel DatagramChannel SocketChannel ServerSocketChannel FileChannel主要用于文件传输,其他三种用于网络通信。 2.B

LIKEGAKKI的博客 1111

【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比

文章目录2.1 使用VBA进行桌面软件开发2.1.1 VBA开发方式2.1.1 VBA代码的安全性2.2 使用DLL进行桌面软件开发2.2.1 DLL开发方式2.2.2 DLL功能的应用部署2.3 使用Add-in进行桌面软件开发2.4 使用ArcGIS Engine构建独立应用程序 对于桌面GIS应用来说,ArcGIS平台不仅提供了用于开发独立运行的GIS应用软件的二次开发工包ArcGIS Engine,还提供了对ArcGIS Deskop桌面软件进行扩展的开发的话,在开发个具体的GIS 行业应用软件时

智慧空间实验室 6507

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

智能AI让学术科研更容易 2554

NIO的三大核心组件详解,充分说明为什么NIO在网络IO中拥有高性能!

一、写在开头 我们在上一篇博文中提到了Java IO中常见得三大模型(BIO,NIO,AIO),其中NIO是我们在日常开发中使用比较多的一种IO模型,我们今天就一起来详细的学习一下。 在传统的IO中,多以这种同步阻塞的IO模型为主,程序发起IO请求后,处理线程处于阻塞状态,直到请求的IO数据从内核空间拷贝到用户空间。如下图可以直观的体现整个流程(图源:沉默王二)。 如果发起IO的应用程序并发量...

weixin_32022555的博客 514

ESD防护设计宝典(二十三):ESD与EOS失效差异分析

ESD和EOS是电子制造业面临的两大挑战,随着电子产品向更高集成度、更低工作电压和更高工作频率发展,这一问题将更加突出。根据美国军方上世纪八十年代与可靠性分析中心(RAC)共同建立的现场失效返回程序(FFRP)统计数据,产品现场返回中EOS占比高达46%,而ESD仅占6%,另有6%的案例难以区分是EOS还是ESD。

m0_56451176的博客 320

java当中什么是NIO

Java NIO作为一种高效的I/O处理方式,特别适合于需要处理大量并发连接的场景。通过使用通道、缓冲区和选择器,NIO在提供非阻塞I/O操作的同时,也提供了灵活的数据处理能力。尽管NIO的编程模型比传统的BIO更为复杂,但在高并发、高性能的应用中,NIO无疑是一个值得选择的解决方案。随着Java的发展,NIO已经成为Java生态中不可或缺的重要组成部分,未来它在高性能计算和并发处理领域将继续发挥重要作用。

Flying_Fish_roe的博客 2611

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

channelinactive触发后不关闭channel_干货|精读Netty源码---NIO之Channel

作者:王博博链接:https://blog.nowcoder.net/n/391c133f004e4623a5b8d6b742215519来源:牛客网NIO简介1、概述Java NIO( New IO 或者 Non Blocking IO ) ,从 Java 1.4 版本开始引入的非阻塞 IO ,用于替换标准( 有些文章也称为传统,或者 Blocking IO 。下文统称为 BIO ) Java ...

weixin_28723171的博客 988

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Netty之NIO核心组件

Java NIO(同步非阻塞)时jdk1.4开始的,java提供了一系列改进的输入/输出的新特性。 NIO可以做到一个线程处理多个操作,假设有10000个请求过来,分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分配10000个。 HTTP2.0使用多路复用技术,做到同一个连接并发处理多个请求,且并发请求的数量比HTTP1.1高几个数量级。 NIO的核心组件: 1、通道(Cha...

勇心在馨 198

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java中NIO核心组件介绍及应用示例代码

Java NIO(New IO 或 Non-Blocking IO)是从Java 1.4版本开始引入的一个新的IO API,旨在替代标准的Java IO API。NIO提供了与标准IO不同的IO工作方式,主要基于通道(Channel)和缓冲区(Buffer)进行操作。以下是对Java NIO的详细使用说明

jackiendsc的博客 1817

Java NIO实例:回显服务

NIO概述 NIO是JDK 1.4开始引入的。弥补了旧的IO的不足之处。 NIO的3个重要组件是缓冲区(Buffer)、通道(Channel)、选择器(Selector)。 Buffer使得可以更加灵活的读/写字节流。 Channel将之前的单向的输入/输出流整合在一起,既可以读,也可以写。 Selector可以监听多个Channel,一个线程就可以应付成千上万的Client连接,轮询得到就绪的事...

MyException Blog 307

Java NIO

新IO和传统的IO有相同的目的,都是用来进行输入/输出,但是新IO使用了不同的方式来处理输入/输出,新IO采用内存映射文件的方式来处理输入/输出,新IO将文件或文件中的一段区域映射到内存中,这样就可以像访问内存一样访问文件. java NIO相关的内容都在java.nio及其子包下: java.nio:主要包含各种与Buffer相关的类 Buffer模型:可参考博客http://my.

The Hot Java 492

Java的NIO及与IO区别

本文转载至:http://www.iteye.com/magazines/132-Java-NIO NIO初窥 Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API 核心组件:Channel、Buffers和Selector NIO和IO主要区别 特征 NIO IO

zhouzhiwengang的专栏 391

JAVA NIO

Buffer对象包含三个重要的属性,分别是capacity、position、limit,其中position和limit的含义取决于Buffer处在读模式还是写模式。Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的(input或output)读写通常是单向的。通道可以非阻塞读取和写入通道,通道可以支持读取或写入缓冲区,也支持异步地读写。Selector是一个ava NIO组件,可以能够检查一个或多个NIO通道,并确定哪些通道已经准备好进行读取或写入。...

qq_37933128的博客 295

JAVA NIO之简介

NIO(New IO)是从Java1.4开始引入的,是可以替代Java IO API 的API。与阻塞式IO(传统IO)不同,他提出了非阻塞信道和事件驱动的IO编程模式。现在常见的技术框架,很多都采用了NIO技术,例如:Tomcat、Netty、Jetty等。所以,学习和掌握NIO技术已经是程序员们必备的技能。      Java.nio包中包含了很多类和组件,提供了很多高级的特性。其中核心应属

rlmls的博客 407

Java NIO 系列教程

Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲...

Coffee的博客 302

Java NIO学习笔记一 Java NIO概述

Java NIO概述 Java NIO(新的IO)是Java的替代IO API(来自Java 1.4),这意味着替代标准的java IO和java Networking API。Java NIO提供了与标准IO API不同的IO工作方式。 Java NIO由以下核心组件组成: 通道 缓冲区 选择器 除了Channel,Buffer并Selector,Java NIO还有...

weixin_34380781的博客 62

NIO(New IO)

文章目录NIO什么是NIOIO回顾概念作用流与块的比较新特性核心组件Buffer缓冲区Buffer缓冲区概述ByteBuffer的创建方式常用方法ByteBuffer写模式和读模式下4个核心变量的变化Channel通道Channel通道概述Channel APIFileChannel基本使用网路编程收发信息accept()阻塞问题Selector选择器(多路复用器)多路复用的概念Selector和Channel的关系可选择通道(SelectableChannel)Channel注册到Selector选择键(

hyment的博客 460

1.NIO概述

/*Java NIO 简介*/ java NIO (New IO)是从 java1.4版本开始引入的一个新的IO API,可以替代标准的 java IO API (jdk1.7又对其进行了改进, 称为NIO2) NIO 与 原来的 IO 有相同的作用和目的,但是使用的方式完全不同,NIO支持面向 /*缓冲区*/的。基于 /*通道*/的 IO 的操作 NIO 将以更加高效的方式进行文件的读写...

weixin_34087301的博客 75
上一篇: 【JAVA开发之架构专题】11. 线程池原理
下一篇: java NIO详解(2)--Buffer
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值