当前位置:编程学习 > JAVA >>

Java NIO入门(二)Channels and buffers(通道和缓冲)

Java NIO 入门(二)Channels and buffers(通道和缓冲)
guibin.beijing@gmail.com

概述
Channel和Buffer是NIO中最核心的对象,他们用在几乎每一个NIO的操作上。

Channel模拟了老IO包中的流的概念。所有去任何地方(或者来自任何地方)的数据都必须通过Channel对象。Buffer本质上说是一个容器对象。任何发送到Channel的数据都必须先放进Buffer,类似的,任何从Channel中读出的数据都先读进Buffer。

在本节中你将学会在NIO中使用Channel和Buffer。

什么是Buffer?
Buffer就是一个装载数据的容器对象,数据从Buffer中读出,或者把数据写入Buffer中。在NIO中添加了Buffer对象,这是NIO和老IO最重要的区别。在面向流的I/O中,你可以把数据直接写入Stream对象,或者直接把数据从Stream中读出来,而不需要任何容器。

Buffer本质上就是一个数组(array)。通常它是一个字节数组,或者其他种类的可用数组。但是Buffer除了是一个数组之外,它还提供了结构化的访问数据的方法,并且还用来跟踪系统的读/写过程。

Buffer的种类
最通常使用的Buffer是ByteBuffer。ByteBuffer允许get/set(也就是读取/写入字节)操作底层的字节数组。

ByteBuffer不是NIO中唯一的buffer,实际上对每种JAVA原生类型都对应一个相应的Buffer。
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer

每种类型的Buffer类都是Buffer接口的一个实例。除了ByteBuffer之外,每个Buffer都有完全一样的操作,区别仅仅在于他们操作的数据类型。因为ByteBuffer用于绝大多数标准的I/O操作,它除了具有其他类型Buffer共有的操作之外,还有一些个性的操作。

什么是Channel?
Channel是这样一个对象:你可以从Channel中读取数据,并且你也可以从Channel中写入数据。NIO与老的IO相比而言,Channel就如同Stream。

就像之前提到的,所有被NIO处理的数据都必须通过Buffer对象,而不能直接将任何字节写入Channel;而是必须先将数据写入Buffer。Buffer中可以包含少到一个字节,多到任何字节数目。相似的,也不能直接从Channel中读取任何字节,必须首先通过Channel将数据读入Buffer,然后再从Buffer中获取数据。

Channel的种类
Channel与Stream的区别在于:Channel是双向的,而Stream只能是单向的(Stream必须是InputStream或者OutpugStream的一个子类,即要么是输入流,要么是输出流,不能即输入又输出),而Channel再被打开之后,即可以读,也可以写,或者同时进行读写操作。

因为Channel是双向的,因此它比Stream更好的反应了底层操作系统IO的实质。特别是在Linux系统中,底层操作系统都是双向的。

作者“guibin”
 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,