陆小曼|Java IO,讲的实在是太好了,这篇

JavaIO是一个庞大的知识体系 , 很多人学着学着就会学懵了 , 包括我在内也是如此 , 所以本文将会从Java的BIO开始 , 一步一步深入学习 , 引出JDK1.4之后出现的NIO技术 , 对比NIO与BIO的区别 , 然后对NIO中重要的三个组成部分进行讲解(缓冲区、通道、选择器) , 最后实现一个简易的客户端与服务器通信功能 。
BIONIO和AIO的区别我们会以一个经典的烧开水的例子通俗地讲解它们之间的区别
类型烧开水BIO一直监测着某个水壶 , 该水壶烧开水后再监测下一个水壶NIO每隔一段时间就看看所有水壶的状态 , 哪个水壶烧开水就去处理哪个水壶AIO不用监测水壶 , 每个水壶烧开水后都会主动通知线程说:“我的水烧开了 , 来处理我吧”
BIO(同步阻塞I/O)
这里假设一个烧开水的场景 , 有一排水壶在烧开水 , BIO的工作模式就是 , 小菠萝一直看着着这个水壶 , 直到这个水壶烧开 , 才去处理下一个水壶 。 线程在等待水壶烧开的时间段什么都没有做 。
NIO(同步非阻塞I/O)
还拿烧开水来说 , NIO的做法是小菠萝一边玩着手机 , 每隔一段时间就看一看每个水壶的状态 , 看看是否有水壶的状态发生了改变 , 如果某个水壶烧开了 , 可以先处理那个水壶 , 然后继续玩手机 , 继续隔一段时间又看看每个水壶的状态 。
AIO(异步非阻塞I/O)
小菠萝觉得每隔一段时间就去看一看水壶太费劲了 , 于是购买了一批烧开水时可以哔哔响的水壶 , 于是开始烧水后 , 小菠萝就直接去客厅玩手机了 , 水烧开时 , 就发出“哔哔”的响声 , 通知小菠萝来关掉水壶 。
什么是流知识科普:我们知道任何一个文件都是以二进制形式存在于设备中 , 计算机就只有0和1 , 你能看见的东西全部都是由这两个数字组成 , 你看这篇文章时 , 这篇文章也是由01组成 , 只不过这些二进制串经过各种转换演变成一个个文字、一张张图片跃然屏幕上 。
而流就是将这些二进制串在各种设备之间进行传输 , 如果你觉得有些抽象 , 我举个例子就会好理解一些:
下图是一张图片 , 它由01串组成 , 我们可以通过程序把一张图片拷贝到一个文件夹中 ,
把图片转化成二进制数据集 , 把数据一点一点地传递到文件夹中,类似于水的流动,这样整体的数据就是一个数据流
顺序读写 。 读写数据时 , 大部分情况下都是按照顺序读写 , 读取时从文件开头的第一个字节到最后一个字节 , 写出时也是也如此(RandomAccessFile可以实现随机读写)字节数组 。 读写数据时本质上都是对字节数组做读取和写出操作 , 即使是字符流 , 也是在字节流基础上转化为一个个字符 , 所以字节数组是IO流读写数据的本质 。 流的分类根据数据流向不同分类:输入流和输出流
输入流:从磁盘或者其它设备中将数据输入到进程中输出流:将进程中的数据输出到磁盘或其它设备上保存


推荐阅读