关于JAVA中NIO缓冲区简介-创新互联

创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!

成都创新互联一直通过网站建设和网站营销帮助企业获得更多客户资源。 以"深度挖掘,量身打造,注重实效"的一站式服务,以网站设计制作、做网站、移动互联产品、营销型网站服务为核心业务。十余年网站制作的经验,使用新网站建设技术,全新开发出的标准网站,不但价格便宜而且实用、灵活,特别适合中小公司网站制作。网站管理系统简单易用,维护方便,您可以完全操作网站资料,是中小公司快速网站建设的选择。

这篇文章主要介绍关于JAVA中NIO缓冲区简介,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel 中, 并且从 Channel 中写入到 Buffer 中。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

缓冲区基础

Buffer 类型有:

关于JAVA中NIO缓冲区简介

缓冲区是包在一个对象内的基础数据的数组,Buffer类相比一般简单数组而言其优点是将数据的内容和相关信息放在一个对象里面,这个对象提供了处理缓冲区数据的丰富的API。

所有缓冲区都有4个属性:capacity、limit、position、mark,并遵循:capacity>=limit>=position>=mark>=0,下面是对这4个属性的解释:

  • Capacity:     容量,即可以容纳的大数据量;在缓冲区创建时被设定并且不能改变
  • Limit:           上界,缓冲区中当前数据量
  • Position:      位置,下一个要被读或写的元素的索引
  • Mark:           标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置即position=mark
     

我们通过一个简单的操作流程来说明buffer的使用,下图是新创建的容量为10的缓冲区逻辑视图:

关于JAVA中NIO缓冲区简介

然后进行5次调用put:

buffer.put((byte)'A').put((byte)'B').put((byte)'C').put((byte)'D').put((byte)'E')

5次调用put之后的缓冲区为:

关于JAVA中NIO缓冲区简介

现在缓冲区满了,我们必须将其清空。我们想把这个缓冲区传递给一个通道,以使内容能被全部写出,但现在执行get()无疑会取出未定义的数据。我们必须将 posistion设为0,然后通道就会从正确的位置开始读了,但读到哪算读完了呢?这正是limit引入的原因,它指明缓冲区有效内容的未端。这个操作 在缓冲区中叫做翻转:buffer.flip()。

Buffer的基本用法

使用Buffer读写数据一般遵循以下四个步骤:

  1. 写入数据到Buffer
  2. 调用flip()方法
  3. 从Buffer中读取数据
  4. 调用clear()方法或者compact()方法
     

当向buffer写入数据时,buffer会记录下写了多少数据。

一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。

一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

下面我们看一段程序来看一下Buffer的基本用法:

public static void readFile(String fileName) {
   RandomAccessFile aFile = null;
   try {
    //文件流
    aFile = new RandomAccessFile(fileName, "rw");
    //将文件输入到管道
     FileChannel inChannel = aFile.getChannel();
    //为buffer分配1024个字节大小的空间
     ByteBuffer buf = ByteBuffer.allocate(1024);
    //将buffer中的内容读取到管道中
     int bytesRead = inChannel.read(buf);
     while (bytesRead != -1) {
       //反转buffer,将写模式改为读模式
       buf.flip();
       while (buf.hasRemaining()) {
        //获取buffer中的数据
        System.out.print((char) buf.get());
       }
      //将上次分配的1024字节的内容清空,为下次接收做准备
       buf.clear();
      //管道重新读取buffer中的内容
       bytesRead = inChannel.read(buf);
     }
     aFile.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
 }

本文名称:关于JAVA中NIO缓冲区简介-创新互联
本文网址:http://scyanting.com/article/dpcchj.html