奥凯航空公司官方网站,深圳vi设计公司全力设计,档案信息网站建设情况,德邦公司网站建设特点“ NIO【Non-blocking IO非阻塞式IO】#xff0c;可以让你非阻塞的使用IO#xff0c;例如#xff1a;当线程从通道读取数据到缓冲区时#xff0c;线程还是可以进行其他事情。当数据被写入到缓冲区时#xff0c;线程可以继续处理它。从缓冲区写入通道也类似#xff0c;主要… “ NIO【Non-blocking IO非阻塞式IO】可以让你非阻塞的使用IO例如当线程从通道读取数据到缓冲区时线程还是可以进行其他事情。当数据被写入到缓冲区时线程可以继续处理它。从缓冲区写入通道也类似主要分为3部分Channels and Buffers and Selectors(通道和缓冲区和选择器)今天我们要讲的就是Buffer概述”听歌时间01—Buffer概述/** * Java NIO中的Buffer用于和NIO通道{Channel【FileChannel|SocketChannel】}进行交互 * 数据是从通道读入缓冲区从缓冲区写入到通道中的。 * 缓冲区本质上是一块可以写入数据然后可以从中读取数据的内存。 * 这块内存被包装成NIO Buffer对象并提供了一组方法用来方便的访问该块内存。 * 用于特定基本类型的数据的缓冲区容器每个非布尔基本类型都有这个类的一个子类 * ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer * 其中和ByteBuffer相关的子类有3个 * MappedByteBufferHeapByteBufferDirectByteBuffer extends MappedByteBuffer * 是特定原始类型的元素的线性有限序列缓冲区。除了其内容【缓冲区数组】 * 缓冲区对象还有其它3个基本属性 * 1capacity:它所包含的元素数量叫缓冲区的容量。缓冲区的容量永远不会为负且永远不会改变 * 2limit:第一个不能被读/写的元素的索引叫缓冲区的限制。缓冲区的限制永远不大于缓冲区的容量 * 3position下一个要读取或写入的元素的索引叫缓冲区的位置。缓冲区的位置永远不会大于其限制。 * Buffer类的每个子类定义了一系列get和put操作: * 相对的读写操作每次都从当前位置开始读写并将位置1 * 绝对的读写操作采用显式的元素索引并不影响位置 * 无论是相对的还是绝对的读写操作索引都不能超过【exceeds】其限制 * 标记位置极限和容量值满足以下关系 * 0 mark position limit capacity * 标记和重置、清理翻转和倒带 * 调用reset方法一定保证mark方法被调用过 * mark方法源码 * mark position;return this; * reset方法源码 * int m mark;if (m 0){throw new InvalidMarkException()};position m;return this; * clear方法源码 * position 0;limit capacity;mark -1;return this; * flip方法源码 * limit position;position 0;mark -1;return this; * rewind方法源码: * position 0;mark -1;return this; * 读与写操作之间要调用flip方法 * 线程不安全可以链式调用 * b.flip().position(23).limit(42); * */02—代码演示import java.nio.ByteBuffer;import java.util.Arrays;public class ByteBufferTest {public static void main(String[] args) {//根据指定的容量创建一个字节缓冲区,两种方式//分配5个字节 ByteBuffer byteBuffer ByteBuffer.allocate(5);//ByteBuffer.wrap(new byte[5]);// 往 ByteBuffer放入数值 byteBuffer.put((byte)10); byteBuffer.put((byte)20);//byteBuffer.putInt(1000);//放入一个int占4个字节 System.out.printf(打印一下字节数组: %s%n,Arrays.toString(byteBuffer.array())); System.out.printf(打印一下是否有字节数组: %s%n,byteBuffer.hasArray()); System.out.printf(打印一下指针位置: %s%n,byteBuffer.position()); System.out.printf(打印一下字节缓冲区容量: %s%n,byteBuffer.capacity()); System.out.printf(打印一下字节缓冲区限制: %s%n,byteBuffer.limit()); System.out.printf(打印一下字节缓冲区从当前位置到限制之间的剩余元素: %s%n,byteBuffer.remaining()); System.out.printf(从当前位置到限制之间是否有剩余元素: %s%n,byteBuffer.hasRemaining()); System.out.printf(是否是直接缓冲区: %s%n,byteBuffer.isDirect()); System.out.printf(该缓冲区是否是只读: %s%n,byteBuffer.isReadOnly());//设置位置和限制 byteBuffer.flip().position(2).limit(4); System.out.printf(打印一下字节数组: %s%n,Arrays.toString(byteBuffer.array()));//get方法获取的是position1的索引对应的值 System.out.printf(flip之后获取位置为2的数据: %s%n,byteBuffer.get()); System.out.printf(标记后重置: %s%n,byteBuffer.mark().reset()); byteBuffer.put((byte)60); System.out.printf(重新获取位置: %s%n,byteBuffer.position());//该方法和flip方法差不多都用于读写切换只不过rewind方法前提是limit被合理的设置 byteBuffer.rewind(); System.out.printf(重新获取值: %s%n,byteBuffer.get());//重置为最开始创建的时候只不过没有清除数据 System.out.printf(重置但不清除数据: %s%n,byteBuffer.clear());//创建一个新的剩余内容子共享缓冲区【也就是说字节数组是共享的】// 该新的缓冲区是指定缓冲区的剩余部分修改哪一个另外一个都会同步修改//这两个缓冲区的位置限制和标记值将是独立的//通过position加上offset来定位在原数组中的位置 ByteBuffer subByteBuffer byteBuffer.slice(); subByteBuffer.put((byte)30); System.out.printf(打印一下子字节数组: %s%n,Arrays.toString(subByteBuffer.array()));//只有调用slice方法offset才会被设置 System.out.printf(打印一下缓冲区偏移量: %s%n,subByteBuffer.arrayOffset()); System.out.printf(打印一下子指针位置: %s%n,subByteBuffer.position()); System.out.printf(打印一下子字节缓冲区容量: %s%n,subByteBuffer.capacity()); System.err.printf(打印一下字节数组: %s%n,Arrays.toString(byteBuffer.array())); System.err.printf(打印一下指针位置: %s%n,byteBuffer.position()); System.err.printf(打印一下字节缓冲区容量: %s%n,byteBuffer.capacity()); System.err.printf(打印一下字节缓冲区限制: %s%n,byteBuffer.limit()); byteBuffer.rewind(); System.err.printf(获取: %s%n,byteBuffer.get()); }}03—MappedByteBuffer概述与联系直接字节缓冲器其内容是文件的存储器映射区域。映射的字节缓冲区是通过FileChannel.map方法创建的。此类扩展了具有特定于内存映射文件区域的操作的ByteBuffer类。映射字节缓冲区及其表示的文件映射在缓冲区本身被垃圾回收之前保持有效。映射字节缓冲区的内容可以随时更改例如如果该程序或其他映射文件的对应区域的内容被更改。这种变化是否发生何时发生是操作系统依赖的因此是未指定的。映射字节缓冲区的全部或部分可能在任何时候变得无法访问例如映射文件被截断。访问映射字节缓冲区的不可访问区域的尝试不会更改缓冲区的内容并将导致在访问时或稍后的时候抛出未指定的异常。因此强烈建议您采取适当的预防措施以避免该程序或同时运行的程序对映射文件进行操作但读取或写入文件的内容除外。映射的字节缓冲区的行为与普通的直接字节缓冲区不同。04—FileChannel写在最后总结今天花了点时间写了关于Buffer的概述关于实战部分请参考往期精彩文章往期精彩文章使用一种全新的方式【java NIO】拆分大电影文件并合并分割后的文件为电影文件如果喜欢欢迎点赞分享给你身边需要的人我欲寻花问路直入白云深处。