实例实现
在代码中使用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中,模型图如下:
4.JDK channel 接口与类图
a3b2f3dd-8113-43d6-87ee-26d300ad5db1.png5.JDK Buffer 抽象类与子类结构图
9eb0a493-2ded-4f85-ad01-d4365c0fd8c0.png6.实现实例的代码(介绍完了,应该实践一下)
ceb8b173-b877-43b6-acb1-854233cf7b16.png代码注意:
bb.flip();一定得有,如果没有,就是从文件最后开始读取的,当然读出来的都是byte=0时候的字符。通过bb.flip();这个语句,就能把buffer的当前位置更改为buffer缓冲区的第一个位置
网友评论