美文网首页橙子学院-30天专注橙长计划
#30天专注成长计划#day 17java并发多线程-NIO-C

#30天专注成长计划#day 17java并发多线程-NIO-C

作者: G先生_海林 | 来源:发表于2016-09-21 17:52 被阅读53次

    实例实现

    在代码中使用channel 通道,将本地的一个文件数据写入另一个文件当中,每次最多读取100个字节。

    1.什么是NIO?

    NIO 是New I/O 的简称,与旧式的基于流的I/O 方法相对,从名字看,他标示新的一套Java I/O 标准,它是在Java1.4中被纳入到JDK 中的,并具有以下特性:

    1.NIO 是基于块(block) 的,它以块为基本单位处理数据,计算机硬盘上的存储单位也是基于块的,所以读写效率更高
    2.为所有的原始类型提供缓存支持(buffer)
    3.增加通道(channel) 对象,作为新的原始I/O 抽象
    4.支持锁和内存映射文件的文件访问借口哦
    5.提供了基于Selector 的异步网络I/O

    2.缓存和内存的区别是什么?

    网上的专业的讲解,但是今天我想通过隐喻来讲解自己所理解的他们之间的区别,说的不对的地方请拍砖。

    专业解释

    缓存是集成于CPU当中,作为CPU运算的存储支撑。由于CPU芯片面积和成本的因素来考虑,缓存都很小。现在一般的缓存不过几M。CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或者硬盘上寻找,以此提高系统性能。
    内存则是作为CPU与硬盘间的存储支撑。插在主板的内存槽中。现在内存一般为1~2G。即1G=1024M
    它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。 内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。

    隐喻

    我想用江河湖泊的水,1000ml杯中的水,口中的水,身体需要。来做比喻
    将入我们的身体需要喝水,怎么样最快喝到水呢。肯定是口里面有大量的水,我们直接咽下去就可以了。但是事实是我们口里面能装的水是有限的,需要从被子里面取。
    在这里我我把杯中的水比作内存,口里的水比作缓存。江河湖泊里面的水比作硬盘。

    3.什么是Channel ,有什么特点?

    Channel类似于传统的流对象,但与传统的流对象有两个主要区别:

    1、Channel可以直接将指定文件的部分或全部直接映射成Buffer。
    2、程序不能直接访问Channel中的数据,包括读、写入都不行,Channel只能与Buffer进行交互。也就是说,如果要从Channel中取得数据,必须先用Buffer从Channel中取出一些数据,然后让程序从Buffer中取出这些数据;如果要将程序中的数据写入Channel,一样先让程序将谁放入Buffer中,程序再将Buffer里的数据写入Channel中,模型图如下:

    Paste_Image.png

    4.JDK channel 接口与类图

    a3b2f3dd-8113-43d6-87ee-26d300ad5db1.png

    5.JDK Buffer 抽象类与子类结构图

    9eb0a493-2ded-4f85-ad01-d4365c0fd8c0.png

    6.实现实例的代码(介绍完了,应该实践一下)

    ceb8b173-b877-43b6-acb1-854233cf7b16.png

    代码注意:

    bb.flip();一定得有,如果没有,就是从文件最后开始读取的,当然读出来的都是byte=0时候的字符。通过bb.flip();这个语句,就能把buffer的当前位置更改为buffer缓冲区的第一个位置

    测试结果如下

    ee5c124a-8b2f-4b19-a9fe-49b05ad1ec69.png

    6.增加一点气氛

    201591620492481261.gif

    相关文章

      网友评论

        本文标题:#30天专注成长计划#day 17java并发多线程-NIO-C

        本文链接:https://www.haomeiwen.com/subject/vvmaettx.html