专栏首页波波烤鸭NIO之缓冲区【复制缓冲区】

NIO之缓冲区【复制缓冲区】

复制缓冲区

  复制一个缓冲区会创建一个新的 Buffer 对象,但并不复制数据。原始缓冲区和副本都会操作同样的数据元素。我们将以 CharBuffer 为例来演示,但同样的操作可被用于任何基本的缓冲区类型。

public abstract class CharBuffer extends Buffer implements CharSequence, Comparable 
{ 
 // This is a partial API listing 
 public abstract CharBuffer duplicate( ); 
 public abstract CharBuffer asReadOnlyBuffer( ); 
 public abstract CharBuffer slice( ); 
}

duplicate

  函数创建了一个与原始缓冲区相似的新缓冲区。两个缓冲区共享数据元素,拥有同样的容量,但每个缓冲区拥有各自的位置,上界和标记属性。对一个缓冲区内的数据元素所做的改变会反映在另外一个缓冲区上。这一副本缓冲区具有与原始缓冲区同样的数据视图。如果原始的缓冲区为只读,或者为直接缓冲区,新的缓冲区将继承这些属性。

public static void main(String[] args) {
    CharBuffer charbuffer1 = CharBuffer.allocate(10);
    CharBuffer charbuffer2 = charbuffer1.duplicate();
    charbuffer1.put('a').put('b').put('c');
    charbuffer1.flip();
    System.out.println(charbuffer1+"--"+charbuffer1.capacity()+" "+charbuffer1.limit()+" "+charbuffer1.position());
	System.out.println(charbuffer2+"--"+charbuffer2.capacity()+" "+charbuffer2.limit()+" "+charbuffer2.position());

}

输出结果

abc--10 3 0
abc   --10 10 0

asReadOnlyBuffer

  asReadOnlyBuffer()函数来生成一个只读的缓冲区视图,这与duplicate()相同,除了这个新的缓冲区不允许使用put(),并且其isReadOnly()函数将会返回true。对这一只读缓冲区的put()函数的调用尝试会导致抛出ReadOnlyBufferException异常。

public static void main(String[] args) {
       CharBuffer charbuffer1 = CharBuffer.allocate(10);
       CharBuffer charbuffer2 = charbuffer1.asReadOnlyBuffer();
       charbuffer1.put('a').put('b').put('c');
       charbuffer1.flip();
       System.out.println(charbuffer1);
       System.out.println(charbuffer2);
       charbuffer2.put("d");
}

输出:

abc
abc
Exception in thread "main" java.nio.ReadOnlyBufferException
	at java.nio.CharBuffer.put(Unknown Source)
	at java.nio.CharBuffer.put(Unknown Source)
	at com.sxt.nio.Demo02.main(Demo02.java:14)

slice

  分割缓冲区与复制相似,但slice()创建一个从原始缓冲区的当前位置开始的新缓冲区,并且其容量是原始缓冲区的剩余元素数量(limit-position)。这个新缓冲区与原始缓冲区共享一段数据元素子序列。分割出来的缓冲区也会继承只读和直接属性。

public static void main(String[] args) {
       CharBuffer charbuffer1 = CharBuffer.allocate(10);
       charbuffer1.put('a').put('b').put('c');
       charbuffer1.flip();
       System.out.println(charbuffer1);
       System.out.println(charbuffer1.position()+" "+charbuffer1.limit()+" "+charbuffer1.capacity());
       charbuffer1.position(1);
       CharBuffer cb = charbuffer1.slice();
       System.out.println(cb);
       System.out.println(cb.position()+" "+cb.limit()+" "+cb.capacity());
}

输出

abc
0 3 10
bc
0 2 2

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NIO之缓冲区【直接和非直接缓冲区】

      字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 I/O 的源头和/或目标。其实发现通道只接收ByteBuffer作为参数这个将Chan...

    用户4919348
  • SpringBoot【整合Listener】

     &esmp;创建一个自定义的Listener,监听ServletContext的初始化和销毁的行为,具体如下:

    用户4919348
  • SpringDataRedis介绍

      SpringDataRedis是Spring大家族中的一个成员,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedi...

    用户4919348
  • PDO::errorInfo讲解

    PDO::errorCode — 返回最后一次操作数据库的错误信息(PHP 5 = 5.1.0, PECL pdo = 0.1.0)

    砸漏
  • 【Phi】斐讯K2P – 从Telnet到刷机

    CPU:MEDIATEK MT7621AT 880MHZ RAM:128MB DDR3 SDRAM FLASH:16 MB SPI Flash 2.4G:...

    Hyejeong小DD
  • 用心去感受,设计背后的认知心理学

    1.我们的感知存在偏差 我们对周围的感知受到过去+现在+将来三方面的影响 ? (1)经验影响感知(过去) 如下图所示: ? 如果此时是房地产经理给你看此图,会看...

    BestSDK
  • [Go] 实战项目在线客服GO-FLY -在gin框架使用IP识别库转换IP为城市

    注意city.free.ipdb文件要放到当前运行程序路径的相对目录下 , 我是放在了 ./config/下面了

    陶士涵
  • VUE-挂载点-实例成员-数据-过滤器-文本指令-事件指令-属性指令-表单指令-01

    目前市面上主流的前端三大框架(均开源):Angular(Facebook主导的)、React(Github主导的)、Vue(尤雨溪个人项目,全球开发者社区维护)

    suwanbin
  • 估计理论(Estimation theory)

    估计理论是对收信端接收到的混有噪声的信号,用统计学方法估计出信号的参量或状态的理论。估计分为参量估计和状态估计两类。参量和状态的区别是:前者随着时间保持不变或只...

    easyAI
  • 揭秘:高薪原来是这样谈出来的!

    用户1756920

扫码关注云+社区

领取腾讯云代金券