博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA NIO学习笔记之Buffer抽象类及ByteBuffer类
阅读量:6582 次
发布时间:2019-06-24

本文共 2475 字,大约阅读时间需要 8 分钟。

hot3.png

准备从今天开始写一些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: 
 * : Cheney   
 * 2016年5月21日 下午11:55:46
 * 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,游标以后一直到上界之间的元素全部平移到这个缓冲区开始的几个位置上,而此时上界回到最初位置,也就是最大容量处。

 

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

转载于:https://my.oschina.net/CheneyLee/blog/685693

你可能感兴趣的文章
解决缺少sql头文件编译错误
查看>>
Docker镜像和容器
查看>>
CentOS系统启动流程
查看>>
分布式数据库之事务隔离性
查看>>
mysql总结3→单表查询1
查看>>
ADO判断ACCESS字段值是否为NULL
查看>>
教你打包自己的专属docker镜像
查看>>
MySQL主从多种架构部署及常见错误问题解析
查看>>
关于负载均衡的几个知识点
查看>>
使用xtrabackup备份innodb引擎的数据库
查看>>
jQuery EasyUI DataGrid动态合并单元格解决方案
查看>>
V 2 heartbeat V2(HA)
查看>>
程序员回家过年生存指南
查看>>
Vim应用
查看>>
esxi安装
查看>>
14、系统架构师指南 - 软件项目角色指南系列文章
查看>>
微软职位内部推荐-SW Engineer II for Windows System
查看>>
【技术交流】让我们来谈一谈多线程和并发任务
查看>>
功能对外vsftpd 服务搭建过程
查看>>
Linux下有7种运行级别
查看>>