准备从今天开始写一些java nio的学习笔记,不会全部写,会写到所有用的多的类里的常用方法。还望大牛们多指点

第一部分是缓冲,缓冲可以大大提高读写速度,所以还是非常重要也是非常基础的。所有种类的缓冲都继承自一个叫Buffer的抽象类,我列出了他所有的方法并总结了每个方法的作用

public abstract class Buffer {
     public final int capacity( )//返回buffer的最大容量
     public final int position( )//返回此时操作缓冲区元素的游标的位置
     public final Buffer position (int newPosition)//重新定义游标的位置
     public final int limit( )//返回此时缓冲区的上界(注意和容量的差别)
     public final Buffer limit (int newLimit)//重新定义缓冲区的上界
     public final Buffer mark( )//标记此时操作缓冲区的游标的位置,方便之后可以重新返回此位置
     public final Buffer reset( )//重置
     public final Buffer clear( )//清空
     public final Buffer flip( )//使缓冲区的上界来到此时的位置,而操作元素的游标重新返回0位置,元素不变并丢弃标记
     public final Buffer rewind( )//使操作元素的游标重新返回0位置并丢弃标记
     public final int remaining( )//返回当前位置和上界之间的元素个数
     public final boolean hasRemaining( )//缓冲区中是否还保留有元素
     public abstract boolean isReadOnly( );//该缓冲区是否只读
 }对于它的子类,我这里只讲ByteBuffer,因为其实所有其他数据类型的缓冲类都是基于字节进行操作的,包括以后要讲到的通道类等,都是基于字节的,所以ByteBuffer是这一家族中最重要也是必须要掌握的。我这里写一个创建字节缓冲流及利用该缓冲流进行基本操作的例子。
package com.java.cheney.nio;
import java.nio.ByteBuffer;
 import java.nio.CharBuffer;/**   
  *    
  * Project: javaDemo   
  * Class: BufferTest   
  * Description: 
  * @author : Cheney   
  * @Date 2016年5月21日 下午11:55:46
  * @version 1.0
  *    
  */
 public class BufferTest {
     public static void main(String[] args) {
         //allocate方法为缓冲区分配大小
         //ByteBuffer buffer = ByteBuffer.allocate(100);
         byte[] bytelist = new byte[100];
         //wrap方法的作用是将数组作为缓冲区
         ByteBuffer buffer = ByteBuffer.wrap(bytelist);
         buffer.putChar('H').putChar('H').putChar('H');
         //flip函数将此时bytebuffer上操作元素的游标重新回到0位置
         buffer.flip();
         ByteBuffer buffer2 = buffer.slice();
         //asCharBuffer为该字节缓冲区创建一个字符视图缓冲区,类似的还有asIntBuffer等讲基本数据类型作为视图缓冲区的方法
         CharBuffer charbuffer1 = buffer.asCharBuffer();
         CharBuffer charbuffer2 = buffer2.asCharBuffer();
         System.out.println(charbuffer1.get());
         System.out.println(charbuffer2.get());
         System.out.println(charbuffer2.get());
         System.out.println(charbuffer2.get());
     }
 }


我简单讲一下我的程序,

创建缓冲区的方式主要有两种,一种是直接利用ByteBuffer的静态方法allocate来为该缓冲区分配空间,有一定C语言功底的理解这句话应该没什么问题吧~另一种方法就是我上面所采用的,建立一个字节数组后利用ByteBuffer的静态方法wrap来包裹数组,也就是将这个数组直接作为了缓冲区,此时对缓冲区操作也就是操作数组。

putChar方法是向缓冲区添加字符元素,类似的方法还有putDouble、putFloat等。

flip函数继承自Buffer抽象类,

slice方法用来创建另一个与此缓冲区共享一段元素子序列的ByteBuffer,也就是说更新其中一个ByteBuffer,在另一个ByteBuffer中是同步更新的。

asCharBuffer用于创建ByteBuffer的视图缓冲区,类似的方法还有asDoubleBuffer等,按需要选择,因为我这里put和get的都是char,所以当时是要建立一个char型的试图缓冲区

以上这几个方法是ByteBuffer类中特别重要的几个方法,需要熟练掌握 ,其他方法还有compact方法用来压缩缓冲区,方法是将此时游标所指的这个元素移动到位置0,游标以后一直到上界之间的元素全部平移到这个缓冲区开始的几个位置上,而此时上界回到最初位置,也就是最大容量处。

 

有什么不明白的地方欢迎留言~