闲情居|详细整理JavaNio原理(二)( 二 )

  • while(buf.hasRemaining()){
  • System.out.print((char) buf.get()); // read 1 byte at a time
  • }
  • buf.clear(); //make buffer ready for writing
  • bytesRead = inChannel.read(buf);
  • }
  • aFile.close();
  • Buffer的capacity,position和limit
    缓冲区本质上是一块可以写入数据 , 然后可以从中读取数据的内存 。 这块内存被包装成NIO Buffer对象 , 并提供了一组方法 , 用来方便的访问该块内存 。
    为了理解Buffer的工作原理 , 需要熟悉它的三个属性:
    • capacity
    • position
    • limit
    position和limit的含义取决于Buffer处在读模式还是写模式 。 不管Buffer处在什么模式 , capacity的含义总是一样的 。
    这里有一个关于capacity , position和limit在读写模式中的说明 , 详细的解释在插图后面 。
    闲情居|详细整理JavaNio原理(二)capacity
    作为一个内存块 , Buffer有一个固定的大小值 , 也叫“capacity”.你只能往里写capacity个byte、long , char等类型 。 一旦Buffer满了 , 需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据 。
    position
    当你写数据到Buffer中时 , position表示当前的位置 。 初始的position值为0.当一个byte、long等数据写到Buffer后 ,position会向前移动到下一个可插入数据的Buffer单元 。 position最大可为capacity – 1 。
    当读取数据时 , 也是从某个特定位置读 。 当将Buffer从写模式切换到读模式 , position会被重置为0 。 当从Buffer的position处读取数据时 , position向前移动到下一个可读的位置 。
    limit
    在写模式下 , Buffer的limit表示你最多能往Buffer里写多少数据 。写模式下 , limit等于Buffer的capacity 。
    当切换Buffer到读模式时 ,limit表示你最多能读到多少数据 。 因此 , 当切换Buffer到读模式时 , limit会被设置成写模式下的position值 。 换句话说 , 你能读到之前写入的所有数据(limit被设置成已写数据的数量 , 这个值在写模式下就是position)
    Buffer的类型
    Java NIO 有以下Buffer类型:
    • ByteBuffer
    • MappedByteBuffer
    • CharBuffer
    • DoubleBuffer
    • FloatBuffer
    • IntBuffer
    • LongBuffer
    • ShortBuffer
    如你所见 , 这些Buffer类型代表了不同的数据类型 。 换句话说 , 就是可以通过char , short , int , long , float 或 double类型来操作缓冲区中的字节 。
    MappedByteBuffer 有些特别 , 在涉及它的专门章节中再讲 。
    【闲情居|详细整理JavaNio原理(二)】原文链接: