欢迎来到天天文库
浏览记录
ID:8975166
大小:20.34 KB
页数:5页
时间:2018-04-13
《java中的缓冲区(直接缓冲区、非直接缓冲区等)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、·Java中的缓冲区(直接缓冲区、非直接缓冲区等)如果将同步I/O方式下的数据传输比做数据传输的零星方式(这里的零星是指在数据传输的过程中是以零星的字节方式进行的),那么就可以将非阻塞I/O方式下的数据传输比做数据传输的集装箱方式(在字节和低层数据传输之间,多了一层缓冲区,因此,可以将缓冲区看做是装载字节的集装箱)。 如果将同步I/O方式下的数据传输比做数据传输的零星方式(这里的零星是指在数据传输的过程中是以零星的字节方式进行的),那么就可以将非阻塞I/O方式下的数据传输比做数据传输的集装箱方式(在字节和低层数据传输之间,多了
2、一层缓冲区,因此,可以将缓冲区看做是装载字节的集装箱)。大家可以想象,如果我们要运送比较少的货物,用集装箱好象有点不太合算,而如果要运送上百吨的货物,用集装箱来运送的成本会更低。在数据传输过程中也是一样,如果数据量很小时,使用同步I/O方式会更适合,如果数据量很大时(一般以G为单位),使用非阻塞I/O方式的效率会更高。因此,从理论上说,数据量越大,使用非阻塞I/O方式的单位成本就会越低。产生这种结果的原因和缓冲区的一些特性有着直接的关系。在本节中,将对缓冲区的一些主要特性进行讲解,使读者可以充分理解缓冲区的概念,并能通过缓冲区来
3、提高程序的执行效率。 创建缓冲区 Java提供了七个基本的缓冲区,分别由七个类来管理,它们都可以在java.nio包中找到。这七个类如下所示: ByteBuffer ShortBuffer IntBuffer CharBuffer FloatBuffer DoubleBuffer LongBuffer st1":*{behavior:url(#ieooui) } 这七个类中的方法类似,只是它们的返回值或参数和相应的简单类型相对应,如ByteBuffer类的get方法返回了byte类型的数据,
4、而put方法需要一个byte类型的参数。在CharBuffer类中的get和put方法返回和传递的数据类型就是char。这七个类都没有public构造方法,因此,它们不能通过new来创建相应的对象实例。这些类都可以通过两种方式来创建相应的对象实例。 1.通过静态方法allocate来创建缓冲区。 这七类都有一个静态的allocate方法,通过这个方法可以创建有最大容量限制的缓冲区对象。allocate的定义如下: ByteBuffer类中的allocate方法: public static ByteBuffer alloc
5、ate(int capacity) IntBuffer类中的allocate方法: public static IntBuffer allocate(int capacity) 其他五个缓冲区类中的allocate方法定义和上面的定义类似,只是返回值的类型是相应的缓冲区类。 allocate方法有一个参数capacity,用来指定缓冲区容量的最大值。capacity的不能小于0,否则会抛出一个IllegalArgumentException异常。使用allocate来创建缓冲区,并不是一下子就分配给缓冲区capacity大
6、小的空间,而是根据缓冲区中存储数据的情况来动态分配缓冲区的大小(实际上,在低层Java采用了数据结构中的堆来管理缓冲区的大小),因此,这个capacity可以是一个很大的值,如1024*1024(1M)。allocate的使用方法如下: ByteBuffer byteBuffer = ByteBuffer.allocate(1024); IntBuffer intBuffer = IntBuffer.allocate(1024); 在使用allocate创建缓冲区时应用注意,capacity的含义随着缓冲区的不同而不同。如
7、创建字节缓冲区时,capacity指的是字节数。而在创建整型(int)缓冲区时,capacity指的是int型值的数目,如果转换成字数,capacity的值应该乘4。如上面代码中的intBuffer缓冲区最大可容纳的字节数是1024*4=4096个。 2.通过静态方法wrap来创建缓冲区。 使用allocate方法可以创建一个空的缓冲区。而wrap方法可以利用已经存在的数据来创建缓冲区。wrap方法可以将数组直接转换成相应类型的缓冲区。wrap方法有两种重载形式,它们的定义如下: ByteBuffer类中的wrap方法:
8、 public static ByteBuffer wrap(byte[] array) public static ByteBuffer wrap(byte[] array, int offset, int length) IntBuffer类中的wr
此文档下载收益归作者所有