欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中的IO:NIO 博客分类: java基础 javaNIOBufferChannelFileChannel 

程序员文章站 2024-03-24 20:29:28
...

目录

1.缓冲区Buffer
2.通道Channel

 

NIO是一种新的IO抽象概念,主要有两个概念,缓冲区和通道,通道用于数据的交互,而每次数据的交互必须经过缓冲区.

 

1.缓冲区Buffer
1.1抽象类Buffer

用于存储特定基本类型数据的容器.除了存储的内容外,缓冲区的基本属性还包括容量、限制、位置和标记:

容量capacity 指包含的元素的数量,缓冲区的容量不能为负并且不能更改
限制limit 指第一个不应该读取或写入的元素的索引,小于等于容量且不能为负
位置position 指下一个要读取或写入的元素的索引,小于等于限制切不能为负
标记mark 也是一个索引,调用mark()方法会在当前位置设置标记,调用reset()方法会将位置重置为标记

标记、位置、限制和容量值遵守以下不变式:0 <= 标记 <= 位置 <= 限制 <= 容量,新创建的缓冲区总有一个0位置和一个未定义的标记,初始限制可以为0,也可以为其他值,这取决于缓冲区类型及其构建方式.一般情况下,缓冲区的初始内容是未定义的.

1.2清除、反转和重绕
clear() 使缓冲区为新的通道操作做好准备:将限制设置为容量大小,将位置设置为0
flip() 使缓冲区为新的通道操作做好准备:将限制设置为当前位置,然后将位置设置为0
rewind() 使缓冲区为重新读取已包含的数据做好准备:使限制保持不变,将位置设置为0
1.3实现类

1)对于每个非boolean基本类型,此类都有一个子类与之对应:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer;
2)视图缓冲区是指其内容受该字节缓冲区支持的另一种缓冲区.我们可以通过as的工厂方法来创建ByteBuffer的视图缓冲器,视图缓冲器的任何修改操作都会映射成对ByteBuffer中数据的修改.

1.4使用

使用Buffer读写数据一般遵循以下四个步骤:
1)写入数据到Buffer
2)调用flip()方法
3)从Buffer中读取数据
4)调用clear()方法
当向buffer写入数据时,buffer会记录下写了多少数据.一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式.在读模式下,可以读取之前写入到buffer的所有数据.一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入.

 

2.通道Channel
2.1与流的不同点

1)既可以从通道中读取数据,又可以写数据到通道,但流的读写通常是单向的
2)通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入

2.2FileChannel的使用

结合Buffer实现文件的复制,例:

public class FileChannelDemo {

	public static void main(String[] args) throws Exception {
		FileInputStream in = new FileInputStream("c:\\a.txt");
		FileOutputStream out = new FileOutputStream("c:\\b.txt");
		FileChannel read = in.getChannel();
		FileChannel write = out.getChannel();
		ByteBuffer bb = ByteBuffer.allocate(20);
		int temp = 0;
		while ((temp = read.read(bb)) != -1) {
			bb.flip();
			write.write(bb);
			bb.clear();
		}
		in.close();
		out.close();
	}
}