`
loquat
  • 浏览: 68494 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java.nio.Buffer

阅读更多

Java.nio.Buffer 是用于特定的基本类型数据(每个非 boolean 基本类型都存在此类的一个子类)的容器(缓冲区),缓冲区是特定的基本类型元素的线性、有限序列。

缓冲区的基本属性除其内容外还包括容量、限制和位置:
缓冲区的容量 capacity() 是它所包含的元素的数量。缓冲区的容量永远不会为负并且从不会更改;
缓冲区的限制 limit() 是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会大于其容量;
缓冲区的位置 position(int newPosition) 是下一个要读取或写入的元素的索引。缓冲区的位置永远不会为负,并且永远不会大于其限制。

在初始状态下,缓冲区的limit和capacity值相同。但limit和capacity的区别是limit可以通过limit方法进行设置,而capacity在创建缓冲区时就已经指定了,并且不能改变。

java.nio.Buffer 的 position, limit, Capacity

如果position的值等于limit,就不能访问缓冲区的当前数据,也就是说不能使用get和put方法。否则将抛出 BufferOverflowException异常。由于使用allocate创建的缓冲区并不是一次性地分配内存空间,因此,可以将缓冲区的 capacity设为很大的值,如10M。缓冲区过大可能在某些环境中会使系统性能降低(如在PDA或智能插秧机中),因此,可以使用limit方法根据具体的情况来限定缓冲区的大小。当然,limit还可以表示缓冲区中实际的数据量。

nio.Buffer的3个方法:清除、反转和重绕

  • clear() 使缓冲区做好了新序列信道读取或相对 put 操作的准备:它将限制设置为容量大小,将位置设置为零。
  • flip() 使缓冲区做好了新序列信道读取或相对 get 操作的准备:它将限制设置为当前位置,然后将该位置设置为零。
  • rewind() 使缓冲区做好了重新读取已包含的数据的准备:它使限制保持不变,并将位置设置为零。
  • 下面用几个例子展示nio.Buffer

    import java.nio.IntBuffer;

    public class InetBuferTest2 {

    public static void main(String[] args) {
    IntBuffer buf = IntBuffer.allocate(8);
    for(int i = 1 ; i <= 8 ; i++){
    buf.put(i);
    }
    System.out.println(buf.position()+ " " + buf.limit());

    //重新设置position
    /*buf.position(1);
    buf.limit(5);
    for(int i = 1; i < 5 ; i++){
    //int temp = buf.get();
    buf.put(10+3);
    }
    System.out.println(buf.get(1));

    buf.flip();
    while(buf.hasRemaining()){
    System.out.print(buf.get()+" ");
    }*/

    //设置子缓冲区
    buf.position(2);
    buf.limit(6);

    IntBuffer sbuf = buf.slice();//设置子缓冲区
    while(buf.hasRemaining()){
    System.out.println(buf.get());
    sbuf.put(10);
    }
    System.out.println(buf.position() + " " + buf.limit());

    buf.flip();//position = 0 但是limit是上次的position 值为2 如果你想全部遍历那么需要把limit设置为最大容量的值
    buf.limit(buf.capacity());
    System.out.println(buf.position() + " " + buf.limit());
    while(buf.hasRemaining()){
    System.out.println(buf.get());
    }

    }

    }

    ===================================================
    //构造一个只读缓冲区

    import java.nio.IntBuffer;

    public class InetBufferTest3 {

    public static void main(String[] args) {

    IntBuffer buf = IntBuffer.allocate(8);
    for(int i = 1 ; i <= 8 ; i++){
    buf.put(i);
    }

    IntBuffer readonly = buf.asReadOnlyBuffer(); //构造了一个只读缓冲区
    readonly.position(0); // 或者 readonly.flip();
    while(readonly.hasRemaining()){
    System.out.println(readonly.get());
    }

    }

    }

    ===============================================

    import java.nio.IntBuffer;

    public class IntBufferTest1 {

    public static void main(String[] args) {

    IntBuffer buf = IntBuffer.allocate(8);

    System.out.println(buf.position() +" "+ buf.limit() + " " + buf.capacity()); //输出结果:0 8 8

    buf.put(1);

    System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity()); //输出结果:1 8 8

    //通过get方法去取其中的每一个元素
    System.out.println(buf.get(0)); //输出结果:1
    System.out.println(buf.get(1)); //输出结果:0,还没有为第2个元素赋值,说明它的所有元素初始值为0

    //直接放一个数组
    buf.put(new int[]{2,3,4});
    System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity());

    //用以下方式去取出已经填充值的元素
    buf.flip();//position变为0 limit变为上次的position

    System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity());

    //hasRemaining 遍历position--->limit
    while(buf.hasRemaining())
    {
    System.out.print(buf.get()+” “); //输出结果:1 2 3 4
    }

    }

    }

    • 大小: 10.2 KB
    分享到:
    评论

    相关推荐

      nio:Clojure对java.nio的支持

      此外,还有三个函数buffer-seq,buffer-nth和buffer-to-array,旨在使将java.nio类集成到Clojure中更加容易。 希望通过将它们的功能滚动到clojure.core中,它们将变得过时。 要使其他功能与ByteBuffers一起使用,还...

      Java NIO 英文文字版

      The NIO package includes many things that have been missing from previous editions of Java that are critical to writing high-performance, large-scale applications: improvements in the areas of buffer ...

      Java NIO实战开发多人聊天室

      12-Java NIO-Buffer-概述.mp4 13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性和类型.mp4 17-Java NIO-Buffer-缓冲区分片.mp4 18-Java NIO-Buffer-只读缓冲区.mp4 19-Java NIO-Buffer-直接缓冲区.mp4 ...

      java网络编程NIO视频教程

      01-Java NIO-课程简介.mp4 02-Java NIO-概述.mp4 03-Java NIO-Channel-概述.mp4 04-Java NIO-Channel-FileChannel(介绍和示例).mp4 05-Java NIO-Channel-FileChannel详解(一)....15-Java NIO-Buffer-分配和读写数据.mp4

      JavaNIO chm帮助文档

      Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) ...

      nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

      Java NIO 源码适合初学者,里面包括通道和Buffer的基本适用,以及文件锁,和内存文件映射等等

      尚硅谷Java视频_NIO 视频教程

      尚硅谷_NIO_缓冲区(Buffer)的数据存取 ·03. 尚硅谷_NIO_直接缓冲区与非直接缓冲区 ·04. 尚硅谷_NIO_通道(Channel)的原理与获取 ·05. 尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集...

      java8源码-nio:java8nio使用的总结

      NIO_缓冲区(Buffer)的数据存取 缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据 4. NIO_直接缓冲区与非直接缓冲区 非直接缓冲区:通过 allocate() 方法分配缓冲区,将...

      NIO实现多用户聊天demo,通过demo深入理解NIO三大组件:buffer、channel、selector

      目录运行效果截图:源代码:Server端:Client端:使用时注意:(持续更新) 运行效果截图: 启动server端: 依次启动client1、client2、client3并输入相应昵称: 三个clent端各自说一句话(红...import java.nio.c

      java nio中文版

      java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

      Java IO, NIO and NIO.2(Apress,2015)

      Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

      java NIO 视频教程

      标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 Java NIO: Non-blocking IO(非阻塞IO) Java NIO...

      NIO概述

      2.2 NIO概述 NIO NIO ==&gt; New IO(新IO), Non-Block IO(非阻塞IO) NIO非阻塞IO,运行当前程序在处理IO事务时,不会影响其他程序的运行,可以在不使用多线程的情况下,满足IO操作要求。...java.nio.Buffer Buffe

      Java+NIO+中文版.pdf

      java nio作者倾力所写的简单易懂的NIO学习指南,让你顺利拿下NIO开发,包括了NIO中的Buffer,Channel,Selector的介绍,理论&代码都有,是你学习NIO的不二法宝~

      Java NIO Buffer过程详解

      主要介绍了Java NIO Buffer过程详解,缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。,需要的朋友可以参考下

      浅谈java中nio的使用方式

      NIO其核心概念包括Channel,Selector,SelectionKey,Buffer.

      Java性能优化之使用NIO提升性能(Buffer和Channel)

      NIO是NewI/O的简称,具有以下特性:为所有的原始类型提供(Buffer)缓存支持;使用java.nio.charset.Charset作为字符集编码解码解决方案;增加通道(channel)对象,作为新的原始I/O抽象;支持锁和内存映射文件的...

      Java-NIO-Programming-Cookbook(含源码)

      Java-NIO-Programming-Cookbook英文版和配套源代码。有一个使用DirectByteBuffer和Non-Direct Buffer文件读取速度的对比实验程序和测试结果。

      Java NIO 电子书

      Java NIO.pdf Dedication ............................................................................................................................. 1 Preface ..........................................

    Global site tag (gtag.js) - Google Analytics