关闭

nio 的buffer 的position capacity limit

433人阅读 评论(0) 收藏 举报
public class ChannelTest2 {
    public static void main(String[] args) {

        CharBuffer bb = CharBuffer.allocate(20);
        // 初始position为0
        System.err.println(bb.position());
        bb.put("abcdefghijklmn");// 如果数据太大则出现java.nio.bufferOverflowException
        // 写了数据之后的position
        System.err.println("position:" + bb.position());
        System.err.println("capacity:" + bb.capacity());
        System.err.println("limit:" + bb.limit());
        
        System.err.println(bb.get());//第一次读时buffer中下一位置无值

        /**==============================================================*/
        bb.flip();
        // flip之后的position
        System.err.println("=======================flip之后===============");
        System.err.println("position:" + bb.position());
        System.err.println("capacity:" + bb.capacity());
        System.err.println("limit:" + bb.limit());
        
        System.err.println("position 的值:"+bb.get());
        
        bb.put("opqrstuvwxyz");//opqrstuvwxyz12:java.nio.bufferUnderflowException
        System.err.println("=======================第二次写之后的值===============");
        System.err.println("position:" + bb.position());
        System.err.println("capacity:" + bb.capacity());
        System.err.println("limit:" + bb.limit());
        
        System.err.println("position 的值:"+bb.get());
        
        bb.limit(20);
        
        System.err.println("=======================设置limit之后的值===============");
        System.err.println("position:" + bb.position());
        System.err.println("capacity:" + bb.capacity());
        System.err.println("limit:" + bb.limit());
        bb.put("123456");
        
        
    }

}


Capacity在读写模式下都是固定的,就是我们分配的缓冲大小,一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。

Position类似于读写指针,表示当前读(写)到什么位置,

Limit在写模式下表示最多能写入多少数据,此时和Capacity相同,在读模式下表示最多能读多少数据,此时和缓存中的实际数据大小相同。

调用flip方法,那么limit就设置为了position当前的值,postion会被置为0,以表示读操作从缓存的头开始读。也就是说调用flip之后,读写指针指到缓存头部,并且设置了最多只能读出之前写入的数据长度(而不是整个缓存的容量大小)。

0
0
查看评论

Java NIO通俗编程之缓冲区内部细节状态变量position,limit,capacity(二)

一、介绍 我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用get()方法从缓冲区获取数据或者使用put()方法把数据写入缓冲区,都会引起缓冲区状态的变...
  • pfnie
  • pfnie
  • 2016-10-16 12:01
  • 1000

NIO知识一 Java NIO(New I/O)的三个属性position、limit、capacity

position: 下一次读取或写入的位置。 limit:指定还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。 capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容...
  • z781582206
  • z781582206
  • 2017-09-06 16:29
  • 137

ByteBuffer的position、limit和capacity

import java.nio.ByteBuffer; public class BufferTest { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(100); ...
  • LoveTea99
  • LoveTea99
  • 2016-06-16 16:45
  • 774

ByteBuffer的mark、position、limit、flip、reset,get方法介绍

之前看过相关的ByteBuffer的使用,但是问题是那时还年轻,所以现在有点老了,因此,忘记了,所以决心看源代码了解一番----故作此篇文章。   查看ByteBuffer的API,看的我是一头雾水,搞不清什么mark、position、limit、flip、reset几个的用...
  • sunzhenhua0608
  • sunzhenhua0608
  • 2014-06-17 17:16
  • 18495

NIO学习笔记——缓冲区(Buffer)详解

缓冲区是包在一个对象内的基本数据元素数组,Buffer类相比一个简单的数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。Buffer的属性容量(capacity):缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变 上界(limit):缓冲区的第一个...
  • fuyuwei2015
  • fuyuwei2015
  • 2017-06-20 21:40
  • 658

《Java源码解析》NIO中Buffer缓冲区的实现

Buffer 缓冲区Java的NIO中Buffer至关重要:buffer是读写的中介,主要和NIO的通道交互。数据是通过通道读入缓冲区和从缓冲区写入通道的。其实缓冲区buffer的本质就是一块可以读写的内存块。这块内存块被包装成NIO的Buffer对象,并提供了一组方法方便读写。3.1 Buffer...
  • u010853261
  • u010853261
  • 2016-12-05 13:18
  • 787

NIO Buffer的细节

在前面的学习中,我们知道Buffer是数据进出通道的唯一方式,并写了几个简单的DEMO。了解了ByteBuffer如何生成,如何与FileChannel传输数据,以及如何通过编码与解码将ByeBuffer转换成CharBuffer。这写操作是Buffer的最基本的操作。现在我们来学习Buffer更细...
  • canot
  • canot
  • 2016-05-01 21:04
  • 824

Buffer中写数据对position,limit,capacity值的影响

Buffer 中position,limit,capacity package bhz.nio.test; import java.nio.IntBuffer; /** * Created by sujk o...
  • u012445622
  • u012445622
  • 2017-03-14 14:27
  • 60

Java Nio 的Buffer和优缺点

在数据传输的时候,我们会用到缓冲区。Java NIO中的Buffer用于和NIO通道进行交互。
  • WSYW126
  • WSYW126
  • 2017-07-16 20:31
  • 478

Java NIO —— Buffer(缓冲区)

Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区。注意:Buffer是非线程安全类。capacity一旦初始化后就不会改变,其值一直为常量。在使用中我们一般使用Buffer的抽象子类ByteBuffer.allocate()方法,实际上是生成ByteArrayBuffer类。(1)...
  • chy555chy
  • chy555chy
  • 2016-08-18 16:46
  • 1470
    个人资料
    • 访问:28751次
    • 积分:441
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:9篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论