Java Nio Buffer 二

2018/01/01 Java

Java Nio Buffer 二

这一次主要介绍Buffer的创建和复制

创建

有七种主要的缓冲区类,每一种都有一种Java类型中的非布尔类型的原始类型数据。这些类都是抽象类,但是都包含了静态工厂方法来创建新的类示例。 如CharBuffer的实现:

 public abstract class CharBuffer
          extends Buffer implements CharSequence, Comparable{
            // This is a partial API listing
            public static CharBuffer allocate (int capacity)
            public static CharBuffer wrap (char [] array)
            public static CharBuffer wrap (char [] array, int offset,int length)
            public final boolean hasArray( ) 
            public final char [] array( ) 
            public final int arrayOffset( )
}

使用allocate函数可以得到一个特定容量的Buffer,如果想使用自己的数组作为buffer的备份存储,调用wrap函数即可。

复制

以创建描述从外部存储到数组中的数据元素的缓冲区对象。缓冲区不限于管理数组中的外部数据。也能管理其他缓冲区中的外部数据。一个管理其他缓冲器所包含的数据元素的缓冲器被创建时,这个缓冲器被称为视图缓冲器。大多数的视图缓冲器都是 ByteBuffer的视图。

视图存储器总是通过调用已存在的存储器实例中的函数来创建。使用已存在的存储器实例中的工厂方法意味着视图对象为原始存储器的内部实现细节私有。数据元素可以直接存取,无论它们是存储在数组中还是以一些其他的方式,而不需经过原始缓冲区对象的 get()/put() API。如果原始缓冲区是直接缓冲区,该缓冲区的视图会具有同样的效率优势。

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()函数创建了一个和原始缓冲区相似的新缓冲区,两个缓冲区共享数据元素,有同样的容量,但是position值不同,limit,mark属性不同。对一个缓冲区内的数据元素的修改会反映在另一个缓冲区上。副本缓冲区和原始缓冲区有这同样的数据视图,即只读缓冲区或者直接缓冲区属性相同。 asReadOnlyBuffer()duplicate()会生成一个只读的缓冲区视图,只是不能put并且isReadOnly()函数返回TRUE。 分割缓冲区与复制相似,但slice()创建一个从原始缓冲区的当前位置开始的新缓冲区,并且其容量是原始缓冲区的剩余元素数量(limit-position)。这个新缓冲区与原始缓冲区共享一段数据元素子序列。分割出来的缓冲区也会继承只读和直接属性。

Show Disqus Comments

Search

    Table of Contents