1.简介 Java NIO 相关类在 JDK 1.4 中被引入,用于提高 I/O 的效率。Java NIO 包含了很多东西,但核心的东西不外乎 Buffer、Channel 和 Selector。...5.总结 Buffer 是 Java NIO 中一个重要的辅助类,使用比较频繁。在不熟悉 Buffer 的情况下,有时候很容易因为忘记调用 flip 或其他方法导致程序出错。
在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别。在面向流的I/O中,您将数据直接写入或者将数据直接读到Stream对象中。 在NIO库中,所有数据都是用缓冲区处理的。...在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NIO中的数据,您都是将它放到缓冲区中。 缓冲区实质上是一个数组。...ByteBuffer不是NIO中唯一的缓冲区类型。...事实上,对于每一种基本Java类型都有一种缓冲区类型(只有boolean类型没有其对应的缓冲区类): ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer...这里就会抛出java.nio.BufferUnderflowException异常,因为数组希望缓存区的数据能将其填满,如果填不满,就会抛出异常,所以代码应该改成下面这样: ?
两个缓冲区共享数据元素,拥有同样的容量,但每个缓冲区拥有各自的位置,上界和标记属性。对一个缓冲区内的数据元素所做的改变会反映在另外一个缓冲区上。这一副本缓冲区具有与原始缓冲区同样的数据视图。...如果原始的缓冲区为只读,或者为直接缓冲区,新的缓冲区将继承这些属性。...System.out.println(charbuffer2); charbuffer2.put("d"); } 输出: abc abc Exception in thread "main" java.nio.ReadOnlyBufferException...at java.nio.CharBuffer.put(Unknown Source) at java.nio.CharBuffer.put(Unknown Source) at com.sxt.nio.Demo02....main(Demo02.java:14) slice 分割缓冲区与复制相似,但slice()创建一个从原始缓冲区的当前位置开始的新缓冲区,并且其容量是原始缓冲区的剩余元素数量(limit-position
NIO之Buffer缓冲区 Buffer缓冲区,所谓的缓冲区其实就是在内存中开辟的一段连续空间,用来临时存放数据。...例如: 初始化缓冲区: capacity: 10, position: 0, limit: 10 mark: java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]...写入缓冲区9个byte: capacity: 10, position: 9, limit: 10 mark: java.nio.HeapByteBuffer[pos=9 lim=10 cap=10]...使用flip重置元素位置: capacity: 10, position: 0, limit: 9 mark: java.nio.HeapByteBuffer[pos=0 lim=9 cap=10]...[pos=9 lim=9 cap=10] 恢复初始化态clear: capacity: 10, position: 0, limit: 10 mark: java.nio.HeapByteBuffer
容量是固定的,但另外的三个属性可以在使用缓冲区时改变 2.3 缓冲区API介绍 接下来我们先看下Buffer中提供的方法 package java.nio; public abstract class...byteBuffer.mark()); } 输出: 初始时-->limit--->10 初始时-->position--->0 初始时-->capacity--->10 初始时-->mark--->java.nio.HeapByteBuffer...-------------- put完之后-->limit--->10 put完之后-->position--->4 put完之后-->capacity--->10 put完之后-->mark--->java.nio.HeapByteBuffer...byteBuffer.mark()); flip完之后-->limit--->4 flip完之后-->position--->0 flip完之后-->capacity--->10 flip完之后-->mark--->java.nio.HeapByteBuffer...b.length)); System.out.println("get完之后-->mark--->" + byteBuffer.mark()); 输出 b o b o get完之后-->mark--->java.nio.HeapByteBuffer
NIO 三大核心组件 对应关系 II . 缓冲区 ( Buffer ) 类 III . 缓冲区 ( Buffer ) 机制 IV . 缓冲区 ( Buffer ) 机制 示例解析 V ....NIO 三大核心组件 对应关系 ---- 下图是 NIO 三大核心组件 , 选择器 ( Selector ) , 通道 ( Channel ) , 缓冲区 ( Buffer ) , 与 服务器端线程 ,...解析上图 NIO 核心组件对应关系 : ① 通道 缓冲区 对应 : 每个 通道 ( Channel ) 都对应一个 缓冲区 ( Buffer ) ; ② 选择器 通道 关联方式 : 每个 选择器 ( Selector...( Buffer ) 本质 : 缓冲区 ( Buffer ) 本质是一个数组 ; ③ 缓冲区 ( Buffer ) 双向机制 : NIO 中的 缓冲区 ( Buffer ) 是 双向 的 , 既可以读取数据...缓冲区 ( Buffer ) 类 ---- Buffer 常用子类 : ByteBuffer : 字节 缓冲区 ; ShortBuffer : 短整型 缓冲区 ; CharBuffer : 字符 缓冲区
直接与非直接缓冲区 字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 I/O 的源头和/或目标。...在Java中,数组是对象,而数据存储在对象中的方式在不同的JVM实现中都各有不同。出于这一原因,引入了直接缓冲区的概念。 直接字节缓冲区通常是I/O操作最好的选择。...将非直接缓冲区的内容复制到临时缓冲中。 使用临时缓冲区执行低层次I/O操作。 临时缓冲区对象离开作用域,并最终成为被回收的无用数据。 ...直接缓冲区是I/O的最佳选择,但可能比创建非直接缓冲区要花费更高的成本。直接缓冲区使用的内存是通过调用本地操作系统方面的代码分配的,绕过了标准JVM堆栈。...建立和销毁直接缓冲区会明显比具有堆栈的缓冲区更加破费,这取决于主操作系统以及JVM实现。直接缓冲区的内存区域不受无用存储单元收集支配,因为它们位于标准JVM堆栈之外。
一、IO和NIO的区别 IO是传统的面向流的阻塞IO,而NIO是面向缓冲区的非阻塞式IO。...在NIO中使用了一个线程来作为Selectors-选择器,来管理多个输入通道,即在使用时只需要将通道注册到选择器中,即可处理输入的通道和选择已经准备好的通道进行管理。...二、Buffer缓冲区与传统IO流 · 传统IO流是对字节数组的流动,单向的输入流和输出流,即面对流的传输。 · NIO本质上也是一个输入输出流。...但是NIO中使用了Buffer缓冲区,会将需要传输的数据存放到缓冲区中再结合通道来进行输入与输出,即面对缓冲区的传输。...· NIO的核心也在于缓冲区与通道,简单来说,缓冲区用于存储需要传输的数据,通用用于传输时的连接。 三、学习Buffer缓冲区 上述已提到,Buffer在NIO中主要负责数据的存储。
NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示例 I ....API 位置 : 在 Java 中 , NIO 定义在 java.nio 包中 ; ⑤ NIO 三大组件 : 通道 Channel : 相当于 BIO 中的 Socket , 用于传输数据 , 向客户端读写数据...NIO 缓冲区 ---- 缓冲区 机制 : 缓冲区 ( Buffer ) 向上与 通道 ( Channel ) 进行数据读写交互 , 向下与 客户端 进行数据读写交互 , 客户端 与 通道 ( Channel...) 不直接进行数据通信 ; ① 缓冲区 ( Buffer ) 作用 : 缓冲区 ( Buffer ) 是实现非阻塞机制的重要途径 ; ② 编程风格 : NIO 也称为 面向 缓冲区 编程 ; ③ BIO...; import java.nio.IntBuffer; public class BufferDemo { public static void main(String[] args) {
大家好,又见面了,我是全栈君 Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向。...读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·FileChannel ·DatagramChannel ·...下一节将具体介绍Buffer:【JAVA】【NIO】4、Java NIO Buffer 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117568.html原文链接
at java.nio.Buffer.nextGetIndex(Buffer.java:506) at java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java...:361) at kim.hsl.nio.BufferDemo2.main(BufferDemo2.java:23) 代码示例 : package kim.hsl.nio; import java.nio.ByteBuffer...at java.nio.HeapByteBufferR.putShort(HeapByteBufferR.java:324) at kim.hsl.nio.BufferDemo3.main(BufferDemo3...//buffer.getInt(); //向只读缓冲区中存放数据抛 java.nio.ReadOnlyBufferException 异常 //readOnlyBuffer.putShort...代码示例 : package kim.hsl.nio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer
在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题。NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题。...本文下面分别从Java NIO的几个基础概念介绍起。 ...一.NIO中的几个基础概念 在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。 ...Buffer(缓冲区),是NIO中非常重要的一个东西,在NIO中所有数据的读和写都离不开Buffer。...三.Buffer Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。
//获取连接通道 FileChannel fileChannel = randomAccessFile.getChannel(); //初始化一个缓冲区...图片.png //初始化一个缓冲区,大小为1024byte ByteBuffer buf01 = ByteBuffer.allocate(128);
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。本系列教程将有助于你学习和理解Java NIO。...Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer...Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。...Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。...缓冲区(Buffer) Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。
NIO概述 NIO中核心概念: Selector:选择器 Channel:通道 Buffer:缓冲区 NIO是面向块(Block)或缓冲区(Buffer)编程。 三....import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector;...import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset...; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector...; import java.nio.channels.SocketChannel; import java.time.LocalDateTime; import java.util.Iterator;
二.NIO原理及通信模型 Java NIO是在jdk1.4开始使用的,它既可以说成“新I/O”,也可以说成非阻塞式I/O。下面是java NIO的工作原理: 1....下面是我理解的java NIO的通信模型示意图: 三、Java NIO概述 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件...java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import...java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel...; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Iterator
了解java的NIO,需要先了解同步异步以及阻塞非阻塞的概念,同步/异步,阻塞/非阻塞 NIO就是采用的同步非阻塞这种组合方式。或简单一点,采用的是IO复用的策略,可以使用一个线程管理多个IO连接。...Java中的NIO 原理接说到这里,下面看一下jdk中NIO的实现和用法。jdk中的NIO的实现,主要几个部分是Channel(通道),Buffer(缓冲区),Selector(选择器)。...每个Channel对应一个缓冲区Buffer,每次Channel中有数据可以读写的时候,就读写到缓冲区中。然后程序再对缓冲区进行操作。...参考文章: Java NIO系列教程 Java NIO:NIO概述 Java IO & NIO & NIO2 Java 网络 IO 模型 Java NIO系列教程(六) 多路复用器Selector Java...网络IO编程总结(BIO、NIO、AIO均含完整实例代码) Java NIO 反应堆模式简单模型 Java NIO(7): Epoll版的Selector Linux IO模式及 select、poll
本文链接:https://blog.csdn.net/luo4105/article/details/72967241 NIO简介 NIO是java1.4开始的替换IO的API,它相对于IO的特点是...1.通道(Channel)和缓冲区(buffer)代替了InputStream和OutputStream 2.非阻塞 3.选择器,实现一个线程管理多个通道。...这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。...buf.flip(); 是把缓冲区切换成读模式,调用flip(),会将position设为0,并将limit设置成之前position的值。...equlas()和compare() equlas()方法是比较是否相等 compare()方法是比较大小 参考资料 1.http://ifeve.com/java-nio-all/
NIO阻塞式 3. Selector(选择器) 3.1. SelectionKey 3.2. NIO非阻塞式 4....DatagramChannel:UDP 获取通道 本地IO,提供了getChannel()方法获取通道 FileInputStream FileOutputStram RandomAccessFile 在JDK1.7中的NIO...,针对各个通道提供了静态方法open() 在JDK1.7中的NIO的Files工具类的newByteChannel() 实例 利用通道实现文件的复制(非直接缓冲区) /** * 使用getChannel...outChannel.write(dst); inchannel.close(); outChannel.close(); } NIO阻塞式 阻塞或者不阻塞是针对SocketChannel...,ServerSocketChannel NIO中的套接字可以轻松在阻塞和非阻塞之间切换,这里我们使用NIO实现阻塞式的TCP数据传输 /** * 客户端使用SocketChannel * 客户端使用
在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。...二、NIO和IO的主要区别 下表总结了Java IO和NIO之间的主要区别: IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 1、面向流与面向缓冲 Java IO和NIO...之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。...Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。...而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。 2、阻塞与非阻塞IO Java IO的各种流是阻塞的。
领取专属 10元无门槛券
手把手带您无忧上云