NIO的Buffer类族和Channel

在NIO的实现中,Buffer是一个抽象类。JDK为每一种Java原生类型都创建了一个Buffer,如图所示。

除了ByteBuffer外,其他每一种Buffer都具有完全一样的操作,唯一的区别仅仅在于它们所对应的数据类型。因为ByteBuffer多用于绝大多数标准I/O操作的接口,因此它有些特殊的方法。

在NIO中和Buffer配合使用的还有Channel。Channel是一个双向通道,既可读,也可写。有点类似Stream,但Stream是单向的。应用程序中不能直接对Channel进行读写操作,而必须通过Buffer来进行。比如,在读一个Channel的时候,需要先将数据读入到相对应的Buffer,然后再Buffer中进行读取。

以一个简单的读文件为例,在读取文件时,首先将文件打开,并取得文件的Channel:

FileInputStream fin = new FileInputStream(new File(“d:\\temp_buffer.tmp”));

FileChannel fc=fin.getChannel();

要从文件Channel中读取数据,必须使用Buffer。因此:

ByteBuffer byteBuffer=ByteBuffer.allocate(1024);

fc.read(byteBuffer);

此时,文件内容已经存在byteBuffer中,因此可以关闭通道,并准备读取byteBuffer:

fc.close();

byteBuffer.flip();

之后,就可以从byteBuffer中取得文件内容。

一个使用NIO进行文件复制的例子如下,它展示了通过NIO进行文件读取和文件写入操作。

public static void nioCopyFile(String resource, String destination)

throws IOException {

FileInputStream fis = new FileInputStream(resource);

FileOutputStream fos = new FileOutputStream(destination);

FileChannel readChannel = fis.getChannel();                //读文件通道

FileChannel writeChannel = fos.getChannel();             //写文件通道

ByteBuffer buffer = ByteBuffer.allocate(1024);                //读入数据缓存

while (true) {

buffer.clear();

int len = readChannel.read(buffer);                    //读入数据

if (len == -1) {

break;                                    //读取完毕

}

buffer.flip();

writeChannel.write(buffer);                        //写入文件

}

readChannel.close();

writeChannel.close();

}

选自 uucode.net

时间: 2024-11-09 09:35:35

NIO的Buffer类族和Channel的相关文章

Java NIO:Buffer、Channel 和 Selector

Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据. java.nio 定义了以下几个 Buffer 的实现,这个图读者应该也在不少地方见过了吧. 其实核心是最后的 ByteBuffer,前面的一大串类只是包装了一下它而已,我们使用最多的通常也是 ByteBuffer. 我们应该将 Buffer 理解为一个数组,IntBuffer.CharBuffer.DoubleBuffer 等分别对应 int[].char[].double[] 等.

Buffer类的详解(转)

Buffer 类是 java.nio 的构造基础.一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索.缓冲区可以被写满或释放.对于每个非布尔原始数据类型都有一个缓冲区类,即 Buffer 的子类有:ByteBuffer.CharBuffer.DoubleBuffer.FloatBuffer.IntBuffer.LongBuffer 和 ShortBuffer,是没有 BooleanBuffer 之说的.尽管缓冲区作用于它们存储

《Java源码分析》:Java NIO 之 Buffer

<Java源码分析>:Java NIO 之 Buffer 在上篇博文中,我们介绍了Java NIO 中Channel 和Buffer的基本使用方法,这篇博文将从源码的角度来看下Buffer的内部实现. 在Java API文档中,对Buffer的说明摘入如下: Buffer:是一个用于特定基本数据类型的容器.这里的特定基本数据类型指的是:除boolean类型的其他基本上数据类型. 缓冲区是特定基本数据类型元素的线性有限序列.除内容外,缓冲区饿基本属性还包括三个重要的属性,如下: 1.capaci

通俗编程——白话NIO之Buffer

Buffer简单介绍 Buffer意为缓冲区.其本质上就是是一块可写入数据,然后能够从中读取数据的内存区域.通过该种方式有助于降低系统开销和提高外设效率.对于缓冲区我们早有所了解,比方在C中标准I/O中的read,write直接调用系统的输入输出.而scanf和printf则借助缓冲区在适当的时候调用read.write操作.在NIO中,为了方便对缓冲区的操作.jAVA设计者将缓冲区封装为Buffer(实际上就是封装了基本数据元素的数组),并提供对应的方法对其操作. 在開始之前,首先须要明确下面

Java NIO -- 缓冲区(Buffer)的数据存取

缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的. Buffer 就像一个数组,可以保存多个相同类型的数据.根据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:ByteBufferCharBuffer ShortBuffer IntBuffer LongBuffer Flo

NIO的Buffer的相关操作

1.Buffer的创建 Buffer的创建可以通过两种方式.使用静态方法allocate()从堆中分配缓冲区,或者是一个既有的数组中创建缓冲区: //从堆中分配 ByteBuffer buffer = ByteBuffer.allocate(1024); //从既有的数组中创建 byte array[] = new byte[1024]; ByteBuffer buffer = ByteBuffer.wrap(array); 2.重置和清空缓冲区 Buffer 还提供了一些用于重置和清空Buff

Node.js权威指南 (5) - 使用Buffer类处理二进制数据

5.1 创建Buffer对象 / 705.2 字符串的长度与缓存区的长度 / 725.3 Buffer对象与字符串对象之间的相互转换 / 74 5.3.1 Buffer对象的toString方法 / 74 5.3.2 Buffer对象的write方法 / 75 5.3.3 StringDecoder对象 / 755.4 Buffer对象与数值对象之间的相互转换 / 775.5 Buffer对象与JSON对象之间的相互转换 / 795.6 复制缓存数据 / 805.7 Buffer类的类方法 /

类族的写法

http://mdsa.51cto.com/art/201507/484133_4.htm 这个模式的精妙的地方在于,调用者可以完全不管子类,事实上,这可以用在设计一个库,可以用来交换实际的返回的类,而不用去管相关的细节,因为它们都遵从抽象超类的方法. 我们的经验是使用类簇可以帮助移除很多条件语句. 一个经典的例子是如果你有为 iPad 和 iPhone 写的一样的 UIViewController 子类,但是在不同的设备上有不同的行为. 比较基础的实现是用条件语句检查设备,然后执行不同的逻辑.

第十一周 项目四 类族的设计】

项目4 - 类族的设计] 按以下的提示,由基类的设计和测试开始,逐渐地完成各个类的设计,求出圆格柱体的表面积.体积并输出并且完成要求的计算任务: (1)先建立一个Point(点)类,包含数据成员x,y(坐标点),实现需要的成员函数,并设计main函数完成测试: (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员r(半径),以及求面积的成员函数area,实现其他需要的成员函数,设计main函数完成测试: (3)再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类