bytebuffer

FileChannel(API详解)

做~自己de王妃 提交于 2019-12-09 20:14:39
1、两种获取通道的方法 FileChannel.open()的方式 FileChannel channell = FileChannel.open(Paths.get("a.txt","c.txt"), StandardOpenOption.CREATE,StandardOpenOption.WRITE); FileChannel channel2 = FileChannel.open(new File("a.txt").toPath(), StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE,StandardOpenOption.READ); path获取 Paths.get() new File(“a.txt”).toPath() OpenOption接口的实现类通常由StandardOpenOption枚举进行代替。 public enum StandardOpenOption implements OpenOption { READ, WRITE, APPEND,//累加 TRUNCATE_EXISTING,//如果该文件已存在并且为写入访问而打开,则其长度将被截断为0。如果只为读取访问打开文件,则忽略此选项。 CREATE,//不能单独使用,要与WRITE配套使用,单独使用会报错java.nio.file

NIO:文件通道与网络通道讲解

时光怂恿深爱的人放手 提交于 2019-12-09 16:44:39
  通道是java.nio的一个创新,既不是一个扩展,也不是一个增强,而是一种全新的IO交流方式,可以提供与IO服务的直接连接, Channel用于在字节缓冲区和通道另一侧的实体(文件或套接字)之间有效的传输数据 类库介绍 顶层接口Channel: 子接口ReadableByteChannel,定义了一个通道可以读的行为 子接口WritableByteChannel,定义了一个通道可以写的行为:   所以,当一个通道实现了ReadableChannel接口,那么该通道就可以读,当一个通道实现了WritableChannel,那么该通道就可以写,如果同时实现了两个接口,则该通道就既可以读,也可以写,是双向的   可以看到ByteChannel引申了可读和可写的接口,这是一种便捷的技巧,后面实现了ByteChannel的类就同时具有了读和写的能力,但是这样确是没有意义的,为什么这样说,对于网络通道来说,双向是正常的,但是对于 文件通道来说,有些就是单向 的,比如FileInputStream获得的文件通道,就只具有可读的特性, 虽然也有write方法,这是因为ByteChannel接口的缘故,但是调用该方法会抛出相应的异常 Scatter和Gather是定义了对缓冲区数组进行操作,这里了解即可,并不常用: 文件通道: 网络通道: 文件通道   从上面的类图可以看出

Getting string from netty ByteBuf

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-09 16:15:42
问题 How can I get the string from a netty ByteBuf ? As of now I am able to get it character by character. Is there a way to get the string object directly? // message is of type ByteBuf for (int i = 0; i < message.capacity(); i++) { byte b = message.payload().getByte(i); System.out.print((char) b); } 回答1: Use the provided method ByteBuf.toString(Charset) . 回答2: use ByteBuf.readCharSequence() example is here: // here we use utf-8 decoding, you can choose the charset you want String s = ByteBuf

深入浅出: 大小端模式

倖福魔咒の 提交于 2019-12-09 11:46:57
Writer :BYSocket(泥沙砖瓦浆木匠) 一、什么大小端? 大小端在计算机业界, Endian 表示数据在存储器中的存放顺序。百度百科如下叙述之: 大端模式 ,是指 数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中 ,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 小端模式 ,是指 数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 ,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。 这两种模式,泥瓦匠记忆宫殿:“ 小端低低 ”。这样就知道小端的模式,反之大端的模式。 比如 整形 十进制数字:305419896 ,转化为十六进制表示 : 0x12345678 。其中按着十六进制的话,每两位占8个位,即1个字节。如图 二、为什么有大小端模式之分呢? 如果统一使用大端或者小端,那么何来三国演义,何来一战二战呢?还有大小端也来源于战争。所以存在即是合理。 在操作系统中,x86和一般的OS(如windows,FreeBSD,Linux)使用的是小端模式。但比如Mac OS是大端模式。 在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外

NIO客户端主要创建过程

烂漫一生 提交于 2019-12-09 11:13:07
NIO客户端主要创建过程: 步骤一:打开SocketChannel,绑定客户端本地地址(可选,默认系统会随机分配一个可用的本地地址),示例代码如下: SocketChannel clientChannel = SocketChannel.open(); 步骤二:设置SocketChannel为非阻塞模式,同时设置客户端连接的TCP参数,示例代码如下: ClientChannel.configureBlocking(false); socket.setReuseAddress(true); socket.setReceiveBufferSize(BUFFER_SIZE); socket.setSendBufferSize(BUFFER_SIZE); 步骤三:异步连接服务端,示例代码如下: boolean connected = clientChannel.connect(new InetSocketAddress(IP,port)); 步骤四:判断是否连接成功,如果连接成功,则直接注册读状态为到多路复用器中,如果当前没有连接成功(异步连接,返回false,说明客户端已经发送sync包,服务端没有返回ack包,物理链路还没有建立),示例代码如下: if(connected){ clientChannel.register(seletor,SelectionKey.OP_READ

Java NIO Socket编程实例

五迷三道 提交于 2019-12-09 11:04:52
各I/O模型优缺点 BIO通信模型 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接 线程池I/O编程 假如所有可用线程都被阻塞,后续I/O都将在队列中排队 线程池采用阻塞队列实现,队列积满之后,后续入队列操作将被阻塞,新的客户端请求被拒绝,发生大量连接超时 NIO编程 缓冲区Buffer 每一种Java基本类型都有对一种缓冲区 大多数标准I/O使用ByteBuffer 通道Channel Channel分为两大类:用于网络读写的SelectableChannel和用于文件操作的FileChannel 多路复用器Selector 多路复用器提供选择已经就绪的任务的能力 NIO2.0 AIO 异步套接字通道不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写 NIO实例分析 NIO服务端序列 步骤一:打开ServerSocketChannel,用于监听客户端的连接 步骤二:绑定监听端口,设置连接为非阻塞模式 步骤三:创建Reactor线程,创建多路复用器并启动线程 步骤四:将ServerSocketChannel注册到Reactor线程的多路复用器Selector上,监听ACCEPT事件 步骤五:多路复用器在线程run方法的无限循环体内轮休准备就绪的Key 步骤六

NIO编程

夙愿已清 提交于 2019-12-09 11:04:22
相关概念 缓冲区Buffer Buffer是一个对象,它包含一些要写入或者要读出的数据。在NIO库中,所有数据都是用缓冲区处理的。缓冲区实质上是一个数组,最常用的缓冲区是ByteBuffer。 通道 Channel 通道像一个自来水管一样,网络数据通过Channel读取和写入。其和流的区别是,流只能在一个方向上移动,而通道可以用于读、写或者二者同时进行。 多路复用器 Selector 多路复用器提供选择就绪的任务的能力。简单来说Selector会不断的轮询注册在其上的Channel。 NIO服务端时序图 打开ServerSocketChannel,用于监听客户端的连接,它是所有客户端连接的父通道。 绑定监听的端口,设置为非阻塞模式 创建Reactor线程,创建多路复用器并启动线程 将ServerSocketChannel注册到Reactor线程的多路复用器Selector上,监听ACCEPT事件 多路复用器在线程run方法的无限循环体内轮询准备就绪的Key 多路复用器监听到有新的客户端接入,处理新的接入请求,完成TCP三次握手,建立物理链路。 设置客户端链路为非阻塞模式。 将新接入的客户端连接注册到Reactor线程的多路复用器上,监听读操作,读取客户端发送的网络消息。 异步读取客户端请求消息到缓冲区 对ByteBuffer进行编解码,如果有半包消息指针reset

NIO服务端主要创建过程

旧城冷巷雨未停 提交于 2019-12-09 11:04:10
NIO服务端主要创建过程: 步骤一:打开ServerSocketChannel,用于监听客户端的连接,它是所有客户端连接的副管道,示例代码如下: ServerSocketChannel acceptorSvr = ServerSocketChannel.open(); 步骤二:绑定监听端口,设置连接为非阻塞模式,示例代码如下: acceptTorSvr.socket().bind(new InetScoketAddress(InetAddress.getByName(IP),port)); acceptorSvr.configureBlocking(false); 步骤三:创建Reactor线程,创建多路复用器并启动线程,示例代码如下: Selector selector = Selector.open(); New Thread(new ReactorTask()).start(); 步骤四:将ServerSocketChannel注册到Reactor线程的多路复用器Selector上,监听ACCEPT事件,示例代码如下: SelectionKey key = acceptorSvr.register(selector,SelectionKey.OP_ACCEPT,ioHandler); 步骤五:多路复用器在线程run方法的无线循环体内轮询准备就绪的key,示例代码如下: int

Netty精粹之玩转NIO缓冲区

此生再无相见时 提交于 2019-12-09 10:19:15
在JAVA NIO相关的组件中,ByteBuffer是除了Selector、Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写入Channel,或是从Channel读入Buffer;而在Netty中,被精心设计的ByteBuf则是Netty贯穿整个开发过程中的核心缓冲区,那么他们俩有什么区别呢?Netty对于缓冲区的设计对于高性能应用又带来了哪些值得借鉴的思路呢?本文在介绍ByteBuffer和ByteBuf基本概念的基础之上对两者进行对比,进而扩展介绍Netty中的ByteBuf大家族。 JAVA NIO之ByteBuffer JAVA NIO中,Channel作为通往具有I/O操作属性的实体的抽象,这里的I/O操作通常指readding/writing,而具有I/O操作属性的实体比如I/O设备、文件、网络套接字等等。光有Channel可不行,我们必须为他增加readding/writing的特性,因此JAVA NIO基于Channel扩展WritableByteChannel和ReadableByteChannel接口。由于本文的重点是ByteBuffer,因此我们对于Channel的设计就看到这里,因为有了WritableByteChannel和ReadableByteChannel之后

Convert ByteBuffer to byte array java [duplicate]

眉间皱痕 提交于 2019-12-09 08:02:34
问题 This question already has answers here : Gets byte array from a ByteBuffer in java (6 answers) Closed 4 years ago . Does anyone know how to convert ByteBuffer to byte[] array? I need to get byte array from my ByteBuffer . When I run bytebuffer.hasArrray() it returns no. Every question I looked so far is converting byte array to byteBuffer, but I need it other way around. Thank you. 回答1: ByteBuffer exposes the bulk get(byte[]) method which transfers bytes from the buffer into the array. You'll