博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
非阻塞套接字(Nonblocking Sockets) 概述
阅读量:4117 次
发布时间:2019-05-25

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

Buffer

在我们考虑非阻塞套接字以前,不得不花费一些字句在一个新的Java 1.4的类:java.nio.Buffer上。一个Buffer实例只是原始数据的一个有限的容器。称其有限是因为它只能包含有限数量的字节;换句话说,它不是一个像Vector或是ArrayList一样的容器,后两者从理论上说是没有限度的。另外,一个Buffer实例仅能包含属于Java的基本数据类型。例如:int,char,double,Boolean,等等。
Buffer类是一个抽象类,它有7个子类分别对应于七种基本的数据类型:
●ByteBuffer
●CharBuffer
●DoubleBuffer
●FloatBuffer
●IntBuffer
●LongBuffer
●ShortBuffer

在非阻塞化套接字编程中,通常所有新 I/O系统能工作的环境中,解决Buffer对象如何工作是关键。这是因为新套接字通道使用Buffer对象通过网络来传送数据。

你可以使用以下静态方法(即类方法)来创建一个新的Buffer实例:allocate,allocateDirect,wrap。在下面的例子中,三个Buffer对象将用三种不同的方法来实例化。

ByteBuffer buffer1 = ByteBuffer.allocate(1024); ByteBuffer buffer2 = ByteBuffer.allocateDirect(1024); ByteBuffer buffer3 = ByteBuffer.wrap(new String("hello").getBytes());
这段代码的前两行创建了两个ByteBuffer对象,它们都包含1024个字节。allocate和allocateDirect方法都做了相同的工作,
不同的是第二个方法直接使用操作系统来分配Buffer。因而它将提供更快的访问速度。不幸的是,
并非所有的虚拟机都支持这种直接分配的方法。
第三行使用wrap方法。它创建了一个ByteBuffer对象,包含的字节由字符串“hello”组成。 Buffer对象的作用或多或少的与流的作用相似。“当前位置(current position)”是一个极其重要的概念,
它计算出你将要处理的Buffer对象的适当的位置。在任何时候,一个Buffer对象都有一个当前位置指向某一项。之后,每一次读或写操作都会自动的将当前位置指向Buffer中的下一项。 你可以用put方法写入一些数据到Buffer中:
// Writing on a buffer IntBuffer buffer = IntBuffer.allocate(10);   for (int i=0; i < buffer.capacity(); i++) {
  buffer.put(i); }

这段代码创建了一个包含10个整型值的Buffer,然后将数字0到9放入到Buffer中。同时你可以看到,我使用了capacity方法来获得Buffer的容量。
要想读取Buffer的内容,你可以用如下方法来处理:

// Reading from a buffer buffer.position(0); while (buffer.hasRemaining()) {
  int i = buffer.get();   System.out.println("i="+i); }

调用position方法,你能设置当前位置为0;即Bufferr的起始位置。当在当前位置和limit值之间有元素时,hasRemaining方法返回true;直到超出这个范围,此方法将返回flase。while循环中的代码调用get方法读取各项,并同时显示在控制台上。
理解Buffer的limit和capacity这两个值之间的区别是十分重要的。Capacity是某个Buffer对象所能包含的项数的最大值。Limit是在0到capacity之间的一个值,它表示一个限度,可以使用limit或者flip方法来设置它。我们来看下面的例子:

// Sample of using flip buffer.position(5); buffer.flip(); while (buffer.hasRemaining()) {
  int i = buffer.get();   System.out.println("i="+i); }

当前位置被position方法设置成5。Flip方法进行如下操作:先将设置limit为当前位置的值,即5;然后再设置当前位置的值为0。因此,此后的while循环就只能扫描到前5个元素了,因为flip方法设置了新的limit值,即为5。从而,数字0,1,2,3,4将被显示出来。
另一个重要的Buffer类的方法是clear,它将设置position为0并设置limit为Buffer的容量值。基本上,clear方法消除这之前flip(或limit)方法产生的影响。考虑下例:

// Sample of using clear buffer.clear(); while (buffer.hasRemaining()) {
  int i = buffer.get();   System.out.println("i="+i); }

这段代码将显示数字0到9,而与Buffer的当前位置和limit值无关。

转载地址:http://ewcpi.baihongyu.com/

你可能感兴趣的文章
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
8种ES6中扩展运算符的用法
查看>>
【视频教程】Javascript ES6 教程28—ES6 Promise 实例应用
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
【web素材】03-24款后台管理系统网站模板
查看>>
【5分钟代码练习】02—用CSS Grid实现响应式图片布局的效果
查看>>
Flex 布局教程:语法篇
查看>>
年薪50万+的90后程序员都经历了什么?
查看>>
2019年哪些外快收入可达到2万以上?
查看>>
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>
我在网易做了6年前端,想给求职者4条建议
查看>>
SQL1015N The database is in an inconsistent state. SQLSTATE=55025
查看>>
RQP-DEF-0177
查看>>
Linux查看mac地址
查看>>
Linux修改ip
查看>>
MySQL字段类型的选择与MySQL的查询效率
查看>>