1.简介
Buffer针对除boolean之外的每个基本类型数据都有一个实现类,即ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer。
它们的基本使用方法已经在Buffer中介绍过了。
1)视图缓冲区
ByteBuffer可以通过方法将字节缓冲区视为包含其他基本类型值的缓冲区。
视图缓冲区 只是其内容受该字节缓冲区支持的另一种缓冲区。字节缓冲区内容的更改在视图缓冲区中是可见的,反之亦然;这两种缓冲区的位置、限制和标记值都是独立的。
2)直接与 非直接缓冲区
字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。
直接字节缓冲区可以通过调用此类的 allocateDirect 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。
直接字节缓冲区还可以通过 mapping 将文件区域直接映射到内存中来创建。Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域,则试图访问该区域不会更改该缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。
字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect 方法来确定。提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。
其它类型的缓冲区要么是直接的,要么是非直接的。通过此类的 wrap 方法创建的缓冲区将是非直接的。当且仅当字节缓冲区本身为直接时,作为字节缓冲区的视图创建的缓冲区才是直接的。通过调用 isDirect 方法可以确定字符缓冲区是否为直接的。
3)字节缓冲区的字节顺序
字节缓冲区定义了除 boolean 之外,读写所有其他基本类型值的方法。这些基本值可以根据缓冲区的当前字节顺序与字节序列互相进行转换,并可以通过 order 方法检索和修改。特定的字节顺序由 ByteOrder 类的实例表示。字节缓冲区的初始顺序始终是 BIG_ENDIAN。
2.实例
package com.siyuan.test.jdk.nio; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.InvalidMarkException; public class ByteBufferTest { /** * @param args */ public static void main(String[] args) { ByteBuffer bBuffer = ByteBuffer.allocate(15); System.out.println(getBufferStatus(bBuffer)); CharBuffer cBuffer = bBuffer.asCharBuffer(); System.out.println(getBufferStatus(cBuffer)); System.out.println("通过bBuffer写入数据"); while ((bBuffer.remaining() / 2) >= 1) { bBuffer.putChar('b'); } System.out.println(getBufferStatus(bBuffer)); System.out.println(getBufferStatus(cBuffer)); System.out.println("通过cBuffer读取内容"); while (cBuffer.hasRemaining()) { System.out.print(cBuffer.get()); } System.out.println(); System.out.println(getBufferStatus(bBuffer)); System.out.println(getBufferStatus(cBuffer)); } public static final String getBufferStatus(Buffer buffer) { StringBuilder str = new StringBuilder(); str.append("容量:").append(buffer.capacity()) .append(",位置:").append(buffer.position()) .append(",限制:").append(buffer.limit()); boolean markExist = false; try { int position = buffer.position(); buffer.reset(); markExist = true; buffer.position(position); } catch(InvalidMarkException e) { } str.append(",存在标志: ").append(markExist); return str.toString(); } }
运行结果:
容量:15,位置:0,限制:15,存在标志: false 容量:7,位置:0,限制:7,存在标志: false 通过bBuffer写入数据 容量:15,位置:14,限制:15,存在标志: false 容量:7,位置:0,限制:7,存在标志: false 通过cBuffer读取内容 bbbbbbb 容量:15,位置:14,限制:15,存在标志: false 容量:7,位置:7,限制:7,存在标志: false
3.参考资料
JDK文档,Thing IN JAVA
相关推荐
可以动态演示nio中buffer的相关操作,直观看到各种重要数据的变化,方便大家更好的理解nio的buffer模型
06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-DatagramChannel.mp4 11-Java NIO-Channel-分散和聚集....
主要介绍一些关于NIO 的基础知识,有浅到深
06-Java NIO-Channel-FileChannel详解(二).mp4 07-Java NIO-Channel-Socket通道-概述.mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-...
尚硅谷_NIO_缓冲区(Buffer)的数据存取 ·03. 尚硅谷_NIO_直接缓冲区与非直接缓冲区 ·04. 尚硅谷_NIO_通道(Channel)的原理与获取 ·05. 尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集...
主要介绍了JAVA NIO之Buffer(缓冲区)的相关资料,文中讲解非常细致,帮助大家更好的学习JAVA NIO,感兴趣的朋友可以了解下
主要介绍了Java NIO Buffer过程详解,缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。,需要的朋友可以参考下
Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) ...
Java NIO系列教程 Java NIO Channel Buffer Selector SocketChannel
java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...
Next, you'll learn about NIO's buffer, channel, selector, regular expression, charset, and formatter APIs. Finally, you'll discover NIO.2's offerings in terms of an improved file system interface, ...
New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...
ReadWriter} nio的Copy方法同时从io.Reader复制到提供的nio.Buffer,然后从nio.Buffer复制到io.Writer。 这样,阻止写入不会降低io.Reader的速度。 import ( "github....
实现多人聊天消息转发,用户发送消息同步到服务中的其他客户端,运用到了nio中buffer、socket、selector。 1、Channel,管道。Channel可以理解为连接,与BIO中Sokcet类似,一个连接对应一个Channel,但Channel中仍...
NIO是NewI/O的简称,具有以下特性:为所有的原始类型提供(Buffer)缓存支持;使用java.nio.charset.Charset作为字符集编码解码解决方案;增加通道(channel)对象,作为新的原始I/O抽象;支持锁和内存映射文件的...
NIO入门.chm NIO入门.chm NIO入门.chm
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket
java nio作者倾力所写的简单易懂的NIO学习指南,让你顺利拿下NIO开发,包括了NIO中的Buffer,Channel,Selector的介绍,理论&代码都有,是你学习NIO的不二法宝~