NIO学习笔记

来源:互联网 发布:租人软件app 编辑:程序博客网 时间:2024/06/10 23:21

综合一些概念性的东西和一些简单的代码片,就NIO的一些概念进行学习

下面是一个简单的代码片,实现的是文件的复制功能

void CopyFile(String from, String To) {FileInputStream fin;FileOutputStream fout;try {fin = new FileInputStream(from);// 为INPUT文件创建一个通道FileChannel finc = fin.getChannel();fout = new FileOutputStream(To);// 为OUTPUT文件创建一个通道FileChannel foutc = fout.getChannel();// 创建一个缓冲区,缓冲区的初始大小为1024bytesByteBuffer buffer = ByteBuffer.allocate(1024);// 将INPUT文件写入缓冲区finc.read(buffer);int len;while ((len = finc.read(buffer)) != -1) {// 读写操作切换buffer.flip();// 从缓冲区读取OUTPUT文件foutc.write(buffer);// 重置缓冲区buffer.clear();}finc.close();foutc.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

在这里可以看到NIO中的几个主要概念:通道(channel),缓冲(buffer)

读文件的步骤:(1) 从 FileInputStream 获取 Channel,(2) 创建 Buffer,(3) 将数据从 Channel 读到 Buffer 中。

同样,写文件也是遵循着类似的步骤:(1) 从 FileOutputStream 获取 Channel,(2) 将数据从Buffer读到Channel 中。

在读写缓冲的时候用到了一个buffer.flip()方法,我们来看一下flip()方法的源代码

    public final Buffer flip() {        limit = position;        position = 0;        mark = -1;        return this;    }

这里面可以看出flip()方法对几个值进行了编辑,这三个值都是缓冲区的状态变量limit,position,mark,另外还有一个这里面未曾编辑,但是初始化时使用的状态变量capacity

缓冲区实际上就是美化了的数组。在从通道读取时,您将所读取的数据放到底层的数组中。 position 变量跟踪已经写了多少数据。更准确地说,它指定了下一个字节将放到数组的哪一个元素中。因此,如果您从通道中读3个字节到缓冲区中,那么缓冲区的position 将会设置为3,指向数组中第4个元素。

同样,在写入通道时,您是从缓冲区中获取数据。 position 值跟踪从缓冲区中获取了多少数据。更准确地说,它指定下一个字节来自数组的哪一个元素。因此如果从缓冲区写了5个字节到通道中,那么缓冲区的position 将被设置为5,指向数组的第6个元素。

limit 变量表明还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。

缓冲区的 capacity 表明可以储存在缓冲区中的最大数据容量。实际上,它指定了底层数组的大小 ― 或者至少是指定了准许我们使用的底层数组的容量。

mark则标记了调用reset()方法时position应该回复的位置。(*存疑)

源代码的注释里面有这样的说明:mark <= position <= limit <= capacity


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被硫酸泼到皮肤怎么办 头磕了一下头晕怎么办 家里有事与工作不能请怎么办 撞了头头晕想吐怎么办 猫不小心摔一下怎么办 一氧化二氮中毒怎么办 电脑开机变慢了怎么办 怎么办抚顺韦德健身卡 预售健身卡合法吗怎么办 被浓硫酸泼到怎么办 婴儿误喝了生水怎么办 宝宝喝了生水拉肚子怎么办 因妈妈喝生水宝宝拉肚子怎么办 喝了几口生水怎么办 不小心吃到蟑螂怎么办 吃了有蛆的樱桃怎么办 不小心误食了蛆怎么办 吃了有蟑螂的汤怎么办 调节天平时指针向右怎么办 香薰蜡烛融化了怎么办 香薰蜡烛挂壁怎么办y 粗蜡烛只烧中间怎么办 紫薯馒头变绿怎么办 小孩手开水烫了怎么办 被油烫伤了怎么办才不留疤 烫伤水泡蹭破了怎么办 烧伤的水泡破了怎么办 烧伤后水泡破了怎么办 烫伤泡破了红肿怎么办 烧伤第二天水泡破了怎么办? 烧伤后换药特别疼怎么办 盐酸溅到皮肤上怎么办 磷性磷酸酶高440怎么办 浓硫酸沾到皮肤上怎么办 浓硫酸溅到皮肤上怎么办 浓硫酸滴到皮肤上怎么办 浓硫酸洒在皮肤上怎么办 浓硫酸溅到眼睛里怎么办 盐酸弄到眼睛了怎么办 稀硫酸进眼睛里怎么办 草酸弄到皮肤上怎么办