java中的IO:NIO

目录

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();
	}
}

猜你喜欢

转载自xiao1zhao2.iteye.com/blog/2199643