java中的IO:NIO 博客分类: java基础 javaNIOBufferChannelFileChannel
目录
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(); } }
推荐阅读
-
java中的IO:NIO 博客分类: java基础 javaNIOBufferChannelFileChannel
-
java中的并发:进程和线程 博客分类: java基础 java进程线程并发
-
Java IO 的一般使用原则 博客分类: JAVA java IO putstream
-
java中的IO:处理流的使用 博客分类: java基础 javaio流处理流缓冲流对象流
-
java基础-参数数量可变的方法 博客分类: Java基础 java可变参数
-
维修中图片实例 博客分类: 图片前端技术Java基础
-
最近写的计算上班时间的程序,检查是否迟到早退,有没有打卡,防止被扣工资 博客分类: Java基础 java工作打卡
-
DK、JRE、JVM的区别及JavaSE、JavaEE和JavaME的区别 博客分类: java基础javaWeb学习
-
DK、JRE、JVM的区别及JavaSE、JavaEE和JavaME的区别 博客分类: java基础javaWeb学习
-
自定义JSP中的Taglib标签之四自定义标签中的Function函数 博客分类: Java