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中: