首页 > 其他分享 >简谈:NIO三大组件之Channel、Buffer

简谈:NIO三大组件之Channel、Buffer

时间:2023-11-03 14:04:47浏览次数:34  
标签:调用 NIO get Buffer 简谈 写入 buffer 方法 channel

NIO释义:non-blocking io 的简写,即 非阻塞 IO

1. Channel

channel类似stream,但更加底层,是读写数据的双向通道,可将channel的数据写入buffer,也可将buffer的数据写入channel

常见的Channel:

FileChannel、DatagramChannel、

SocketChannel、ServerSocketChannel

2. Buffer

buffer用来缓冲读写数据,类似一个缓冲区

常见的buffer:

ByteBuffer(MapperByteBuffer、DirectByteBuffer、HeapByreBuffer)、

ShortBuffer、IntBuffer、LongBuffer、

FloatBuffer、DoubleBuffer、CharBuffer

我们主要了解一下ByteBuffer

2.1.结构:

2.1.1.重要属性:

capacity:容量

position:(写入/读取) 位置

limit:(写入/读取) 限制

简谈:NIO三大组件之Channel、Buffer_Channel

简谈:NIO三大组件之Channel、Buffer_读取数据_02

简谈:NIO三大组件之Channel、Buffer_读取数据_03

简谈:NIO三大组件之Channel、Buffer_数据_04

简谈:NIO三大组件之Channel、Buffer_读取数据_05

简谈:NIO三大组件之Channel、Buffer_读取数据_06

2.1.2.向buffer写入数据的两种方式:

调用channel的read方法:

int readBytes = channel.read(buffer);

调用buffer自己的put方法

buffer.put(abc);

2.1.3从buffer读取数据的两种方式:

调用channel的write方法:

int writeBytes = channel.write(buffer);

调用buffer自己的get方法:

byte b = buffer.get();

注意:get方法会让position读指针往后走,如果想要重复读取数据

调用rewind方法将position重置为0

调用get(index)方法(index为整数),获取索引index的内容,该方法不会移动读指针

2.2使用方式:

1、向buffer写入数据,例如调用channel.read(buffer),该方法表示从channel中读取数据并写入到buffer中。(注意:此时我们要站在buffer的角度)

2、调用flip( )从写模式切换至读模式

3、从buffer读取数据,例如调用buffer.get( )。

4、调用clear( )方法或者compact( )方法。

clear( )方法:position被设回0,limit被设置成 capacity的值。

compact( )方法:将所有未读的数据拷贝到Buffer起始处,然后将position设到最后一个未读元素后面。limit属性设置成capacity的值

重复步骤1~4


标签:调用,NIO,get,Buffer,简谈,写入,buffer,方法,channel
From: https://blog.51cto.com/u_16338376/8164419

相关文章

  • protocol buffer 基础
    我们知道接口传输数据的格式有XML,它是webservices使用的传输数据的格式,在webservices中叫WSDL。https://www.w3school.com.cn/wsdl/index.asp不过webServices已经是被淘汰的技术了。现在更是主流的是使用JSON作为数据传输格式。HTTP+JSON是黄金搭档。什么是protocolbuf......
  • Java NIO包结构简介
    layout:postread_time:trueshow_date:truetitle:JavaNIO包结构date:2023-07-0910:12:10-0600description:JavaNIO包结构简述.img:posts/java-nio/cover.pngtags:[java,IO,JavaNIO,ChannelIO,Buffer,threadsafty,multiplexer,charset]author:尹......
  • CMU15445 2023fall——PROJECT #1 - BUFFER POOL
    PROJECT#1-BUFFERPOOLASSIGNMENT翻译点击查看Task#2-DiskScheduler翻译Task#2-DiskScheduler(磁盘调度程序)该组件负责调度DiskManager上的读写操作。实现disk_scheduler.h文件和disk_scheduler.cpp文件。Thiscomponentisresponsibleforschedul......
  • InnoDB 存储引擎之 Double Write Buffer
    一、概述InnoDB默认page页大小为16KB,Linux操作系统文件交互的最小单位是4KB,而磁盘的最小交互单位是扇区,大小一般为512B假设InnoDB存储引擎在向磁盘写入数据时,Mysql服务器突然宕机,那么就有可能只有一部分数据页写入到磁盘,另外一部分数据发生丢失,这种情况称为......
  • 麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器
    原文链接:麒麟KYLINIOS软件仓库搭建01-新创建软件仓库服务器hello,大家好啊,今天给大家带来麒麟桌面操作系统软件仓库搭建的文章01-新创建软件仓库服务器,本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版本上搭建内网软件仓库源,本系列共有三个内容,欢迎大家浏览分享转发。关......
  • InnoDB 存储引擎之 Insert Buffer / Change Buffer
    Mysql5.7InnoDB存储引擎整体逻辑架构图一、索引概述CREATETABLE`t_user`(`id`int(10)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键id',`name`varchar(32)NOTNULLDEFAULT''COMMENT'姓名',`age`smallint(4)NOTN......
  • NativeBuffering,一种高性能、零内存分配的序列化解决方案[性能测试篇]
    第一版的NativeBuffering([上篇]、[下篇])发布之后,我又对它作了多轮迭代,对性能作了较大的优化。比如确保所有类型的数据都是内存对齐的,内部采用了池化机器确保真正的“零内存分配”等。对于字典类型的数据成员,原来只是“表现得像个字段”,这次真正使用一段连续的内存构架了一个“哈希......
  • tomcat nio2源码分析
    一、前言​ 最近在看tomcatconnector组件的相关源码,对Nio2的异步回调过程颇有兴趣,平时读源码不读,自己读的时候很多流程都没搞明白,去查网上相关解析讲的给我感觉也不是特别清晰,于是就自己慢慢看源码,以下是我自己的见解,因为开发经验也不多,刚成为社畜不久,有些地方讲错如果有大佬......
  • [931] arcpy - buffer, delete shp and rename shp
    Thescriptisasfollows:arcpy.analysis.Buffer("siteboundary.shp","siteboundary1.shp","-5Centimeters","FULL","ROUND","NONE",None,"GEODESIC")arcpy.management.Delete("siteboundary......
  • Project#1: Buffer Pool
    撰写本文的目的:记录本人在不参考其他任何形式的解决方法(思路/源码)、仅靠课程提供的资源(课本/参考资料)和Discord中highlevel的讨论的情况下,独立完成该课程的过程。欢迎大家和我讨论学习中所遇到的问题。ZiHao'sBlog由于gradescope中对non-cmustudents仅开放了Project#0,本文方......