`
eyesmore
  • 浏览: 378524 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Buffer

阅读更多

 

内容一、基本概念

java.io.Buffer的相关定义:A container for data of a specific primitive type.

 

(这点上很类似于DataInputStream,DataOutputStream,不同的是一个提供的是基于流的操作,具有单向,不可逆性;Buffer不再是流了。)

 

/**
 * A container for data of a specific primitive type.
 *
 * <p> A buffer is a linear, finite sequence of elements of a specific
 * primitive type.  Aside from its content, the essential properties of a
 * buffer are its capacity, limit, and position: </p>

 * (0<=position<=limit<=capacity        注:capacity一旦确定就不能更改)
 *
 * <blockquote>
 *
 *   <p> A buffer's <i>capacity</i> is the number of elements it contains.  The
 *   capacity of a buffer is never negative and never changes.  </p>
 *
 *   <p> A buffer's <i>limit</i> is the index of the first element that should
 *   not be read or written.  A buffer's limit is never negative and is never
 *   greater than its capacity.  </p>
 *
 *   <p> A buffer's <i>position</i> is the index of the next element to be
 *   read or written.  A buffer's position is never negative and is never
 *   greater than its limit.  </p>
 *
 * </blockquote>

内容二、基本操作

* <h4> Transferring data </h4>  存取数据
 *
 * <p> Each subclass of this class defines two categories(绝对和相对存取) of <i>get</i> and
 * <i>put</i> operations: </p>
 * (相对以前的IoStream变化体现在操作更为灵活,不仅局限于单向,不可以逆的流操作。)
 * <blockquote>
 *
 *   <p> <i>Relative</i> operations read or write one or more elements starting
 *   at the current position and then increment the position by the number of
 *   elements transferred.  If the requested transfer exceeds the limit then a
 *   relative <i>get</i> operation throws a {@link BufferUnderflowException}
 *   and a relative <i>put</i> operation throws a {@link
 *   BufferOverflowException}; in either case, no data is transferred.  </p>

      

      读写异常:

      get  (if: current+requested > limit)  throw:   BufferUnderflowException

      write (if:  current+requested > limit) throw:    BufferOverflowException
 *
 *   <p> <i>Absolute</i> operations take an explicit element index and do not
 *   affect the position.  Absolute <i>get</i> and <i>put</i> operations throw
 *   an {@link IndexOutOfBoundsException} if the index argument exceeds the
 *   limit.  </p>

 

内容三、标记

* <h4> Marking and resetting </h4>
 *在IoStream中也有类似的操作,只是为了这种流操作的单向性。
 * <p> A buffer's <i>mark</i> is the index to which its position will be reset
 * when the {@link #reset reset} method is invoked.  The mark is not always
 * defined, but when it is defined it is never negative and is never greater
 * than the position.  If the mark is defined then it is discarded when the
 * position or the limit is adjusted to a value smaller than the mark.(mark被隐含失效)
 

 

If the mark is not defined then invoking the {@link #reset reset} method causes an
 *
{@link InvalidMarkException} to be thrown.

 

 

内容四、控制

 

<h4> Clearing, flipping, and rewinding </h4>
 *
 * <p> In addition to methods for accessing the position, limit, and capacity
 * values and for marking and resetting,

     this class also defines the following operations upon buffers:
 *
 * <ul>
 *
 *   <li><p> {@link #clear} makes a buffer ready for a new sequence of
 *   channel-read or relative <i>put</i> operations: It sets the limit to the
 *   capacity and the position to zero.  </p></li>
 *
 *   <li><p> {@link #flip} makes a buffer ready for a new sequence of
 *   channel-write or relative <i>get</i> operations: It sets the limit to the
 *   current position and then sets the position to zero.  </p></li>
 *

       当我们创建完毕一个Buffer以后,我们应该养成这样的习惯:

      (1)放数据前,clear下,确保position从0开始写;(2)取数据前,flip下,确保我们只取有效数据【一般(limit,capacity]间的数据全部是0】。

      (3)如果我们要改变流操作的特性,需要对同一份数据进行多次读取的话,那么如果【全部复读】,则直接rewind下;如果【部分复读】则使用mark and reset。
 *   <li><p> {@link #rewind} makes a buffer ready for re-reading the data that
 *   it already contains: It leaves the limit unchanged and sets the position
 *   to zero.  </p></li>
 *
 * </ul>
 *

 

public class ByteBufferDemo {
 public static void main(String[] args) {
  ByteBuffer buf = ByteBuffer.allocateDirect(12);
  buf.clear();//put前准备操作
  buf.putInt(10);
  buf.putInt(20);
 //buf.putInt(30);//留4个字节没放东西,所以有效空间是[0,8)
  buf.flip();//get前准备操作
  System.out.println(buf.getInt());
  System.out.println(buf.getInt());
  System.out.println(buf.getInt());//读取时超过了有效范围
//  【全部复读】
  buf.rewind();
  System.out.println(buf.getInt());
  System.out.println(buf.getInt());
  
//  【部分复读】
  System.out.println("演示复读");
  buf.rewind();
  System.out.println(buf.getInt());
//  现在要对第2个int复读两次
  buf.mark();
  System.out.println(buf.getInt());//第一次读取
  buf.reset();//准备第二次读取
  System.out.println(buf.getInt());

  /* 10
   * 20
   * Exception in thread "main" java.nio.BufferUnderflowException
 at java.nio.Buffer.nextGetIndex(Buffer.java:404)
 at java.nio.DirectByteBuffer.getInt(DirectByteBuffer.java:620)
 at com.umpay.construct.ByteBufferDemo.main(ByteBufferDemo.java:17)
   * */
 }
}
	 

 

内容五、注意事项

 

(1)非线程安全

* <h4> Thread safety </h4>
 *
 * <p> Buffers are not safe (非线程安全)for use by multiple concurrent threads.  If a
 * buffer is to be used by more than one thread then access to the buffer
 * should be controlled by appropriate synchronization.

 

(2)只读

 

* <h4> Read-only buffers </h4>
 *
 * <p> Every buffer is readable, but not every buffer is writable.  The
 * mutation(指:会改变对象状态的方法) methods of each buffer class are specified as <i>optional
 * operations</i> that will throw a {@link ReadOnlyBufferException} when
 * invoked upon a read-only bufferA read-only buffer does not allow its
 * content to be changed, but its mark, position, and limit values are mutable. (因为:这些变量都属于内部维护的变量InVar)
 * Whether or not a buffer is read-only may be determined by invoking its
 * {@link #isReadOnly isReadOnly} method.
 *

分享到:
评论

相关推荐

    c语言实现循环buffer

    4. 检查缓冲区状态:`int cyclic_buffer_empty(cyclic_buffer_t* buffer)`和`int cyclic_buffer_full(cyclic_buffer_t* buffer)`分别判断缓冲区是否为空或已满。 5. 清空缓冲区:`void cyclic_buffer_clear(cyclic_...

    ArcMap中Buffer的创建及使用

    ArcMap 中 Buffer 的创建及使用 ArcMap 中的 Buffer,亦称为“缓冲区分析”,是一个重要的空间分析工具。它以点、线、面实体为基础,自动建立其周围一定宽度范围内的缓冲区多边形图层,然后建立该图层与目标图层的...

    Rt-thead studio软件下使用ringbuffer

    - RT-Thread提供了标准的RingBuffer接口,包括`rt_ringbuf_create`用于创建RingBuffer,`rt_ringbuf_put`和`rt_ringbuf_get`分别用于数据的插入和提取,以及`rt_ringbuf_space`和`rt_ringbuf_len`用于查询剩余空间...

    buffer应用缓冲区

    在计算机科学领域,Buffer(缓冲区)是一种重要的概念,它在数据处理中起着至关重要的作用。Buffer的应用广泛,特别是在网络编程,尤其是Socket编程中,它扮演着数据传输的桥梁角色。本文将深入探讨Buffer的基本原理...

    netty-buffer-4.1.68.Final-API文档-中文版.zip

    赠送jar包:netty-buffer-4.1.68.Final.jar; 赠送原API文档:netty-buffer-4.1.68.Final-javadoc.jar; 赠送源代码:netty-buffer-4.1.68.Final-sources.jar; 赠送Maven依赖信息文件:netty-buffer-4.1.68.Final....

    Z-Buffer消隐算法C#实现

    Z-Buffer消隐算法,又称为深度缓冲算法,是计算机图形学中用于处理多边形遮挡问题的一种重要方法。在3D图形渲染过程中,当多个几何物体在同一个视点下重叠时,如何正确地确定哪些部分是可见的,哪些部分被遮挡,就是...

    Z-Buffer消隐算法的Matlab实现

    Z-Buffer消隐算法是计算机图形学中的一个重要技术,用于解决多边形渲染时的遮挡问题。在3D场景中,多个物体可能会相互重叠,Z-Buffer算法通过为每个像素分配一个深度值(Z值)来决定哪个物体应该位于前面。在Matlab...

    Buffer.zip_buffer

    在IT行业中,Buffer是计算机内存管理中的一个重要概念,特别是在处理数据读写操作时。Buffer.zip_buffer这个标题可能指的是一个特定的缓冲区实现,它被设计用于VC(Visual C++)环境,但经过修改以实现跨平台兼容性...

    Oracle Buffer和Cache的区别

    Oracle数据库中的Buffer Cache和一般的Cache概念虽然相似,但它们在具体应用中有着不同的侧重点。首先,我们需要理解Buffer Cache的基本概念。在Oracle数据库系统中,Buffer Cache是内存结构的一部分,它存储了最近...

    前端开源库-buffer-loader

    **前端开源库-BUFFER-LOADER** 前端开源库Buffer-loader是一种专门为WebPack设计的加载程序模块,它在处理二进制数据,如音频、图片或任何需要使用Node.js中的`Buffer`对象的资源时,提供了便利。这个加载器的主要...

    Lab1-Buffer OverFlow

    **Buffer Overflow:概念与原理** Buffer Overflow(缓冲区溢出)是计算机安全领域的一个常见漏洞,它发生在程序尝试写入超过内存分配空间的数据时。这种现象可能导致数据丢失、程序崩溃,甚至恶意攻击者利用该漏洞...

    Zbuffer扫描线消隐算法

    **Zbuffer扫描线消隐算法**是计算机图形学中的一个重要技术,用于在三维场景中处理多边形的深度冲突,确保近处的物体遮挡远处的物体,从而提供正确的视觉效果。Zbuffer,也称为深度缓冲区,是实现这一算法的关键数据...

    ffmpeg 采集pcm 音频 dshow 低延时 audio_buffer_size 设置

    在本场景中,我们关注的是使用 FFmpeg 从麦克风实时采集 PCM(Pulse Code Modulation)音频数据,并通过调整 dshow(DirectShow)的 audio_buffer_size 参数来实现低延迟的音频流处理。 PCM 是一种数字音频编码方式...

    Protocol_Buffer官网文档中文版

    ### Protocol_Buffer官网文档中文版知识点总结 #### 一、简介与概览 - **Protocol Buffer**是一种用于数据序列化的高效工具,支持多种编程语言(如Java、C++、Python等),能够实现数据的有效存储和传输。 #### ...

    VLC input buffer管理

    为了保证流畅和准确的播放,VLC实现了一套复杂的输入缓冲区(input buffer)管理机制。以下是对VLC input buffer管理的详细分析,涵盖了其重要性和具体实现的几个关键点。 背景分析: 在播放网络视频流时,由于网络...

    circularbuffer_zip_circularbuffer_源码

    《C#实现循环缓冲区(CircularBuffer)详解》 在软件开发中,循环缓冲区(Circular Buffer)是一种高效的数据结构,常用于数据流处理、实时系统以及多线程环境下的数据共享。它利用有限的存储空间,通过环形的数据...

    多线程读写问题循环buffer

    本示例中的“多线程读写问题循环buffer”着重探讨了如何在多个线程之间安全地共享一个循环缓冲区,以实现高效的数据交换。 首先,我们需要理解“循环buffer”的概念。循环缓冲区是一种内存管理策略,它利用数组或...

    databuffer_test.rar_databuffer_directfb

    本实例主要探讨了如何使用DirectFB库中的DataBuffer组件进行操作。下面我们将深入讲解DataBuffer和DirectFB的相关知识。 首先,DirectFB(Direct Frame Buffer)是一个跨平台的库,主要用于构建嵌入式系统的用户...

    环形buffer无锁一线程写一线程读

    如果你在找一个环形buffer这就是你想要的了。使用场景为一个线程写一个线程读完全不需要锁。可以设定buffer的初始块及数量,初始块是固定大小的,当需要扩环时会动态创建块即不像其它的库块满了就写失败了,当释放时...

    RingBuffer 循环缓存 亲测可用 V2 修改一处

    4.当写入数据的长度大于ringbuffer的可写入长度时,多余的数据将会丢弃。所以写入数据前,先判断ringbuffer的可写入长度。另外程序包含示例。 支持windows平台的vs与linux平台的clion,语言级别实现,与平台无关。 ...

Global site tag (gtag.js) - Google Analytics