NIO 之Buffer

一、Buffer 的种类

Java NIO 有以下Buffer类型

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

二、Buffer 属性capacity,position和limit

    position和limit的含义取决于Buffer处在读模式还是写模式。不管Buffer处在什么模式,capacity的含义总是一样的。

三、Buffer创建

ByteBuffer的例子。

1ByteBuffer buf = ByteBuffer.allocate(48);

这是分配一个可存储1024个字符的CharBuffer:

1CharBuffer buf = CharBuffer.allocate(1024);

四、Buffer 的方法

4-1 写数据

写数据到Buffer有两种方式:

  • 从Channel写到Buffer。
  • 通过Buffer的put()方法写到Buffer里。

从Channel写到Buffer的例子

int bytesRead = inChannel.read(buf); //read into buffer.

通过put方法写Buffer的例子:

buf.put(127);

4-2 flip()方法

flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。

换句话说,position现在用于标记读的位置,limit表示之前写进了多少个byte、char等 —— 现在能读取多少个byte、char等。

4-3 读数据

  1. 从Buffer读取数据到Channel。
  2. 使用get()方法从Buffer中读取数据。

从Buffer读取数据到Channel的例子:

int bytesWritten = inChannel.write(buf);


使用get()方法从Buffer中读取数据的例子

 

byte aByte = buf.get();

4-4 clear()与compact()方法

clear() : position将被设回0,limit被设置成 capacity的值。再无法得到未读取的数据;

compact() : 将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。还可以得到未读取的数据。 

 

4-5 mark()与reset()方法

通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个

4-6 案例:

public class BufferTest {
    public static void main(String[] args) {

        //创建指定长度的缓冲区
        IntBuffer buff = IntBuffer.allocate(10);

        int[] array =  new int []{3, 5, 1};

        //使用数组来创建一个缓冲区视图
        buff = buff.wrap(array);

        System.out.println("\n原缓冲区数据:");
        for ( int i = 0 ; i < buff.limit(); i++ ) {
            System.out.print(buff.get() + "\t");
        }

        //对缓冲区某个位置上面进行元素修改
        buff.put(0,7);

        System.out.println("\n修改后缓冲区数据:");
        for ( int i = 0 ; i < buff.limit(); i++ ) {
            System.out.print(buff.get(i) + "\t");
        }

        System.out.println("\n修改后数组数据:");
        for ( int i = 0 ; i < array.length; i++ ) {
            System.out.print(array[i] + "\t");
        }

        //buff.flip();  //对缓冲区进行反转
        //buff.clear();
        System.out.println("\n Buffer 信息 :" + buff);

        // 复制一个新的缓冲区
        IntBuffer buff2 = buff.duplicate();

        System.out.println("\n 新buff2 信息 : " + buff2);
        buff2.flip();
        for (int i = 0 ; i < buff2.limit() ; i++){
            System.out.print(buff2.get() + "\t");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值