Java Nio学习总结

Posted shuoli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Nio学习总结相关的知识,希望对你有一定的参考价值。

在学习操作系统时,我们都知道DMA(直接内存读取)的作用,以前I/O是调用一次系统中断去告诉cpu我搬来4k的数据块让cpu来计算,
如此循环往复,这样cpu与I/O的交互次数就变得非常多,而DMA是将以大块数据块(远大于4k)全部传输完再去调用中断让cpu工作。
因此在DMA传输任务完成之前,cpu是有大把的事件快活。
我们再来看看java虚拟机,传统的java I/O类 喜欢读取小块字节数据,这时候获取了DMA提供的大块缓冲区,此时java的流数据类就会把
他拆成很多小块。这样效率就大大降低了,因此java推出了 NIO(ByteBuffer对象)。
传统的I/O模型其实也可以移动大量数据,RandomAccessFile持使用基于数组的read( )和write( )方法,这些方法和系统调用相当接近,但
他必须至少保存一份缓冲区拷贝。

I/O


技术分享图片
用户空间就是我们常说的目态(非特权区域,不能直接调用系统权利例如读取硬件设备),内核空间就是管态(特权区域,为操作系统所
持)

为什么不能直接从磁盘读取数据到用户空间呢?


因为磁盘上的操作的数据块是固定大小的而用户进程请求的可能是任意大小,甚至是边界不对齐的数据块,这时候需要第三者(内核)来负
责数据分块、组合工作,然后进行转发。

基础概念


进入NIO正题:缓冲区(Buffer)
下面这张图介绍了缓冲区家族成员
技术分享图片

缓冲区的属性:容量,上界,位置,标记。
容量(CapCapacity):缓冲区可以容纳数据的最大数量。
上界(Limit):缓冲区第一个不能读/写的元素。即,当前缓冲区存在元素的个数。
位置(Position):





















以上是关于Java Nio学习总结的主要内容,如果未能解决你的问题,请参考以下文章

## 20155336 2016-2017-2《JAVA程序设计》第八周学习总结

Java Nio学习总结

20145207 《Java程序设计》第8周学习总结

Java NIO学习系列五:I/O模型

Java IO学习总结

netty学习总结