Java NIO概述及要点摘录

#普通IO与NIO区别?

IO:按流处理数据,速度慢;普通IO;
NIO:按块处理数据,速度快;通过通道channel和缓冲区buffer作为基础的面向块的IO处理;

#通道channel和缓冲区buffer是什么?
通道和缓冲区是NIO的核心对象;
channel是对原有IO包中流的模拟,到任何目的地的数据都需要通过channel对象;字节
buffer是一个容器对象,发送给一个channel的所有对象都必须首先放到buffer中,同样,从channel中读取的数据都要读到buffer中,是不能直接从channel中读取数据的,只能通过buffer;
buffer是一个数据,常用的是字节数组ByteBuffer,缓冲区还提供了对数据的结构化访问,可以跟踪系统的读写进程;

#通道channel是对旧的IO流的模拟,那么通道与旧的io流的区别在哪里?
channel是双向的,可以同时读写,unix底层操作系统通道也是双向的;
旧的IO流是单向的;

#NIO的文件读写
读取文件步骤:从FileInputStream获取channel,创建Buffer,将数据从channel读到buffer中;
读文件:

FileInputStream fin = new FileInputStream("demo.txt");
FileChannel fc = fin.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
fc.read(buffer);

 

 写文件:

FileOutputStream fout = new FileOutputStream("demo.txt");
FileChannel fc - fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
for(int i=0; i< message.length; i++){
	buffer.put(message[i]);
}
buffer.flip();
fc.write(buffer);

#NIO读写时,我们不需要告诉通道要读多少数据到缓冲区中,每一个缓冲区都有复杂的内部统计机制,它会跟踪已经读了多少数据及还有多少空间可以容纳更多的数据,JDK中是如何设计和实现这个个机制的?(待深入研究.)

 

#缓冲区内部实现机制
缓冲区的两个重要实现组件:状态变量,访问方法;
每一种java基本类型的缓冲区都是对象类Buffer的子类;buffer有三个似有属性:
private int position = 0;//跟踪了向缓冲区中写入多少数据或者从缓冲区中读取了多少数据;
private int limit;//表明还有多少数据需要取出,或还有多少空间可以放入数据;
private int capacity;//该缓冲区的最大数据容量;
每个基本类型的缓冲区底层实上就是一个该类型的数组;例如ByteBuffer中的final byte[] nb;
从通道读取数据,实际上是将读取的数据放到该数组中,向通道中写入时,是将该数组中的数据写入到通道中;
#如何使用
使用缓冲区将数据从输入通道拷贝到输出通道:

while(true){
	buffer.clear();
	int r = fcin.read(buffer);
	if(r==-1){
		break;
	}
	buffer.flip();
	fcout.write(buffer);
}

 其中:clear(),flip()用于让缓冲区在读写之间切换;

 

#连网与异步IO
nio中的连网与nio中的其它操作无区别,仍然是依赖于通道和缓冲区,使用InputStream和OutputStream获取通道;
异步io调用不会阻塞。它的最大优势:允许同时根据大量的输入和输出执行IO,同步程序常常求助于轮询或者创建许多线程处理大量连接,使用异步IO,可以监听任何数量的通道上的事件,不用轮询,也不用额外的线程;

应用实例:基于非组赛io的服务器端的处理流程,它接收网络连接并向它们回响它们可能发送的数据。

private void execute () throws IOException { // 创建一个新的选择器
	Selector selector = Selector.open();
	// 打开在每个端口上的监听,并向给定的选择器注册此通道接受客户端连接的I/O事件。 
	for (int i = 0; i < ports.length; i++) {
		// 打开服务器套接字通道
		ServerSocketChannel ssc = ServerSocketChannel.open(); // 设置此通道为非阻塞模式
		ssc.configureBlocking(false);
		// 绑定到特定地址
		ServerSocket ss = ssc.socket();
		InetSocketAddress address = new InetSocketAddress(ports[i]); ss.bind(address);
		// 向给定的选择器注册此通道的接受连接事件 
		ssc.register(selector, SelectionKey.OP_ACCEPT); 
		System.out.println("Going to listen on " + ports[i]);
	}
	while (true) {
		// 这个方法会阻塞,直到至少有一个已注册的事件发生。
		// 当一个或者更多的事件发生时,此方法将返回所发生的事件的数量。 int num = selector.select();
		// 迭代所有的选择键,以处理特定的I/O事件。
		Set<SelectionKey> selectionKeys = selector.selectedKeys(); Iterator<SelectionKey> iter = selectionKeys.iterator();
    	SocketChannel sc;
    	while (iter.hasNext()) {
        	SelectionKey key = iter.next();
		if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) { 
			// 接受服务器套接字撒很能够传入的新的连接,并处理接受连接事件。 
			ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
			sc = ssc.accept();
			// 将新连接的套接字通道设置为非阻塞模式 
			sc.configureBlocking(false);
			// 接受连接后,在此通道上从新注册读取事件,以便接收数据。 
			sc.register(selector, SelectionKey.OP_READ);
			// 删除处理过的选择键
			iter.remove();
	            	System.out.println("Got connection from " + sc);
        	} else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
			// 处理读取事件,读取套接字通道中发来的数据。 
			sc = (SocketChannel) key.channel();
			// 读取数据
			int bytesEchoed = 0; 
			while (true) {
	                    echoBuffer.clear();
	                    int r = sc.read(echoBuffer);
	                    if (r == -1) {
	                        break;
			}
	                echoBuffer.flip();
	                sc.write(echoBuffer);
	                bytesEchoed += r;
	       }
	      System.out.println("Echoed " + bytesEchoed + " from " + sc); // 删除处理过的选择键
	      iter.remove();
	} 
    }
  } 
}

 

 #使用allocate()分配缓冲区

ByteBuffer buffer = ByteBuffer.allocate(1024);

 其中,allocate()方法分配一个具有指定大小的底层数组,同时包装到一个对象中,例如ByteBuffer;

 

#使用数组转换成缓冲区

byte array[] = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap(array);

 #缓冲区如何分片

 

实际上就是创建一个子缓冲区,新旧缓冲区的一部分共享数据;

ByteBuffer buffer = ByteBuffer.allocate(10);
for(int i=0; i<buffer.capacity(); i++){
	buffer.put((byte)i):
}
//分片
buffer.position(3);
buffer.limit(7);
ByteBuffer slice = buffer.slice();

 #如何创建只读缓冲区,及作用?

 

调用缓冲区的asReadOnlyBuffer()方法,将缓冲区转化为只读,只读缓冲区可以保护数据,使数据不被修改;

#直接和间接缓冲区
#内存映射文件IO

#将文件的前1024个字节映射到内存

MappedByteBuffer mbf = fc.map(FileChannel.MapModel.READ_WRITE, 0 , 1024);
<pre>
#分散,聚集IO 
读:
 <pre lang="java">
long read(ByeteBuffer[] dst);
long read(ByteBuffer[] dst, in offset, int length);

 

 写:

long write(ByeteBuffer[] dst);
long write(ByteBuffer[] dst, in offset, int length);

 

 

参考:《NIO学习总结.pdf》

FortiOS路径遍历漏洞CVE-2022-41328实战复现:从环境搭建到漏洞利用全记录 本文深入解析FortiOS路径遍历漏洞CVE-2022-41328,从漏洞背景、影响范围到技术原理进行全面剖析。提供详细的漏洞复现环境搭建步骤和实战利用方法,并给出官方修复方案与临时缓解措施,帮助企业有效防御此类防火墙漏洞风险。 阅读详情

相关推荐

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

java中nio的用法总结,Java NIO 要点总结

Wed Jan 21, 2015 by idouba injavajava, nio来自Jenkov.com的比较完整但是足够brief的一个系列:Java NIO Tutorial,介绍了NIO的主要机制和其中几个重要对象的作用和工作。1. 三个对象NIO核心的三个对象:ChannelsBuffersSelectors简单讲三个对象:Channel 像IO的流,Buffer就像名字一样,就是个缓...

weixin_30271235的博客 315

基于Cohesive单元的二维水力压裂(二)

部件 2D-deformabel-shell 尺寸100 矩形工具(-20,-20)(20,20) 刨分:预知cohesive单元&定位注液点位置,定义全局网格尺寸0.2 X方向采用过渡网格,向中间加密。指定网格类型:CPE4P,指定单元类型,COH2D4P,粘性正则化系数:0.0001 材料属性 材料1 弹性模量10e9,泊松比0.25,渗透率1e-7,孔隙比0.1,液体比重...

s0302017的博客 1598

java NIO系列教程1

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

weixin_30263277的博客 207

西门子PLC与汇川SV660P伺服速度模式配置实战指南

本文详细介绍了西门子S7-1200 PLC与汇川SV660P伺服驱动器在速度模式下的配置实战指南。从硬件接线、伺服参数配置到TIA Portal软件组态和PLC程序编写,提供了全面的操作步骤和实用技巧,帮助工程师快速解决伺服系统调试中的常见问题,确保系统稳定运行。

weixin_30316097的博客 500

STM32新手必看:AHT20温湿度传感器实战指南(附完整I2C代码)

本文详细介绍了如何使用STM32驱动AHT20温湿度传感器,包括硬件连接、I2C通信协议解析、驱动代码优化及实战调试技巧。通过对比AHT20与DHT11、SHT30等传感器的性能,突出AHT20的高性价比优势,并提供完整的I2C代码示例,帮助新手快速上手嵌入式传感器开发。

weixin_29163857的博客 293

摘录:Java NIO trick and trap

摘录自淘宝Java中间件团队的博客 Java NIO trick and trap NIO神话 使用NIO = 高性能     NIO不一定更快的场景       客户端应用      连接数<1000      并发程度不高      局域网环境下 NIO完全屏蔽了平台差异     NIO仍然是基于各个OS平台的IO系统实现的,差异仍然存在 使用N...

weixin_30849403的博客 111

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 749

Java NIO框架Netty教程(六)-Java NIO Selector模式

看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实现也是基于Java的Selector的,是对Selector的封装。所以,我个人认为理解好Selector对于使用和理解Netty都是很多有帮助的。当然,如果您确实不关心这些,只想会用Netty就可以了。那么下文,您可以略过:)

CoderCoding的博客 1233

DDS信号发生器设计避坑指南:从AD9834配置到巴特沃斯滤波实战

本文详细解析了基于AD9834芯片的DDS信号发生器设计中的关键技术要点与常见陷阱,涵盖时钟源选择、寄存器配置时序、巴特沃斯滤波器设计等核心内容。针对中高频段信号质量优化,提供了实用的解决方案和代码示例,帮助工程师规避设计误区,提升信号发生器的性能和稳定性。

2y3u4i5o6p的博客 782

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 985

NIO摘录

NIO,一种基于通道和缓冲区的I/O方式,可以使用native函数库直接分配堆外内存,然后通过一个存储在java 堆的DirectBteBuffer对象作为这块内存的引用进行操作,避免了再java堆和native堆中来回复制数据。 NIO是一种同步非阻塞的IO模型。同步是指线程不断轮询IO事件是否就绪,非阻塞指线程在等待IO的时候,可以 同时做其他任务。同步的核心是Selector,S...

weixin_30917213的博客 63

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践

本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。

m0_67505153的博客 1269

NIO知识摘录

在 JDK 1. 4 中 新 加入 了 NIO( New Input/ Output) 类, 引入了一种基于通道和缓冲区的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆的 DirectByteBuffer 对象作为这块内存的引用进行操作,避免了在 Java 堆和 Native 堆中来回复制数据。       NIO 是一种同步非阻塞的 IO ...

weixin_34246551的博客 78

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Netty源码分析摘录】(一)如何从BIO演进到NIO,再到Netty

文章目录前言BIONIONetty总结 前言 结合我自身学习Netty的经历,在正式进入Netty的源码分析,决定有必要先说说BIO、NIO的关系。在平时工作中,很少直接写网络编程的代码,即使要写也都是使用成熟的网络框架,很少直接进行Socket编程。下面将结合一个Demo示例,来熟悉下网络编程相关知识。在Demo示例中,客户端每隔三秒向服务端发送一条Hello World的消息,服务端收到后进行打印。 BIO BIO是阻塞IO,也称之为传统IO,在Java的网络编程中,指的就是ServerSocket、S

m0_45406092的博客 390

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android jni开发摘录,Android JNI开发摘录(六)之JNI线程、NIO、反射处理

七.使用JNI进行高级编程JNI向本机例程程序员提供了其他几种能力。由于Java是一个多线程环境,与线程相关的例程在本机端是可用的。JNI也支持将本机例程单独公开给Java代码,而不是通过对System.load或者System.loadLibrary的调用使所有本机函数对于Java代码都立即可用。除了这些特性意外,Java还在本机公开反射库。1.Java线程由于Java是一个多线程环境,那么在一...

weixin_29796903的博客 238

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java NIO框架Netty教程(六) Java NIO Selector模式

上一篇:Java NIO框架Netty教程(五) 消息收发次数不匹配的问题    http://www.it165.net/pro/html/201207/3219.html 看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实现也是基于Java的Selector的

jackwu_2015的博客 2420

tomcat NIO

Tomcat的NIO是基于I/O复用来实现的。对这点一定要清楚,不然我们的讨论就不在一个逻辑线上。I/O模型一共有阻塞式I/O,非阻塞式I/O,I/O复用(select/poll/epoll),信号驱动式I/O和异步I/O。首先看下IO的五种模型。下面是摘录前辈的文章 ,分析的不错,仅做收藏 1.1 五种I/O模型 1)阻塞I/O 2)非阻塞I/O 3)I...

guang_heng的专栏 1273

java 的io 和nio的简单读写

最近遇到多线程文件读取的问题。即把io和nio 简单比较一下: 贴出代码: //io的读写操作 public static void testIO() throws IOException { FileInputStream fins= null; FileOutputStream fouts = null; try {

yelloo的博客 500

Java NIO框架Netty教程 (八) Java NIO Selector模式

看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实现也是基于Java的Selector的,是对Selector的封装。所以,我个人认为理解好Selector对于使用和理解Netty都是很多有帮助的。当然,如果您确实不关心这些,只想会用Netty就可以了。那么下文,您可以

u010476464的博客 708

【IO】【文章摘录】

Java NIO原理图文分析及代码实现 关于Java NIO的一些看法 NIO与传统IO的区别 java的io读写,缓冲区是如何提高读写效率的 深入java NIO系列之缓冲区分析与源码解读 深入分析 Java I/O 的工作机制

盖世英雄 176

NIO(二)——SELECT

本文的行文思路是对照一个典型的例子,将select的整个IO过程捋一遍。,另外还会涉及一些平时容易忽略的知识点。概述 IO过程主要分为:1)数据准备阶段;2)数据操作阶段。所谓的阻塞非阻塞IO,主要指的都是第一个阶段。 NIO主要有三大部分:Channel,Buffer,Selector。NIO(Non-Blocking IO或New IO)是相对于BIO(Blocking IO)而言的。BIO

nyyjs的专栏 592

Android JNI开发摘录(六)之JNI线程、NIO、反射处理

七.使用JNI进行高级编程 JNI向本机例程程序员提供了其他几种能力。由于Java是一个多线程环境,与线程相关的例程在本机端是可用的。JNI也支持将本机例程单独公开给Java代码,而不是通过对System.load或者System.loadLibrary的调用使所有本机函数对于Java代码都立即可用。除了这些特性意外,Java还在本机公开反射库。 1.Java线程...

weixin_34360651的博客 154

NIO------翻译/标记

摘录于------NIOJava NIO: Channels and BuffersIn the standard IO API you work with byte streams(字节流) and character streams(字符流). In NIO you work with channels and buffers. Data is always read from a ch...

lihai755的博客 391

java学习进阶之路(摘录)

java程序员 高级特性反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入核心编程IO、多线程、实体类、集合类、正则表达式、 XML和属性文件图形编程AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace网路编程Applet、Socket/TCP/UDP、NIO、RMI、CORBAJava语法基础类、抽象类、接口、最终类、静态类、匿名...

qq_41060065的博客 423

实习面经摘录(八)

NIO优势:一个线程可以管理成千上万个连接(只有当连接真的有数据读写时才处理),适合高并发场景。Netty:基于NIO封装的高性能网络框架,解决了原生NIO API复杂、易出错(如粘包拆包)的问题。定义/use:在类上加@Component@Service,或在配置类方法上加@Bean。使用时在字段/构造器上加注入注解。区别@Autowired:Spring自带,默认按类型装配。若类型多个,需配合指定名称。@Resource:JDK标准(JSR-250),默认按名称装配。找不到名称再按类型。

qq_64012735的博客 475
上一篇: Sun:无线Java与无线游戏娱乐应用
Graphics_Arts
博客等级 码龄19年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值