目录
1.缓冲区Buffer
2.通道Channel
?
NIO是一种新的IO抽象概念,主要有两个概念,缓冲区和通道,通道用于数据的交互,而每次数据的交互必须经过缓冲区.
?
用于存储特定基本类型数据的容器.除了存储的内容外,缓冲区的基本属性还包括容量、限制、位置和标记:
容量capacity 指包含的元素的数量,缓冲区的容量不能为负并且不能更改 限制limit 指第一个不应该读取或写入的元素的索引,小于等于容量且不能为负 位置position 指下一个要读取或写入的元素的索引,小于等于限制切不能为负 标记mark 也是一个索引,调用mark()方法会在当前位置设置标记,调用reset()方法会将位置重置为标记标记、位置、限制和容量值遵守以下不变式:0 <= 标记 <= 位置 <= 限制 <= 容量,新创建的缓冲区总有一个0位置和一个未定义的标记,初始限制可以为0,也可以为其他值,这取决于缓冲区类型及其构建方式.一般情况下,缓冲区的初始内容是未定义的.
1)对于每个非boolean基本类型,此类都有一个子类与之对应:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer;
2)视图缓冲区是指其内容受该字节缓冲区支持的另一种缓冲区.我们可以通过as的工厂方法来创建ByteBuffer的视图缓冲器,视图缓冲器的任何修改操作都会映射成对ByteBuffer中数据的修改.
使用Buffer读写数据一般遵循以下四个步骤:
1)写入数据到Buffer
2)调用flip()方法
3)从Buffer中读取数据
4)调用clear()方法
当向buffer写入数据时,buffer会记录下写了多少数据.一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式.在读模式下,可以读取之前写入到buffer的所有数据.一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入.
?
1)既可以从通道中读取数据,又可以写数据到通道,但流的读写通常是单向的
2)通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入
结合Buffer实现文件的复制,例:
class="java" name="code">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(); } }
?