java nio探险

时间:2022-03-08 02:22:18

区别于io:

  nio是基于通道和缓冲区的,io是基于字节流和字符流的,(千万别被这些破名词唬住)。以读取文件为例,文件就是自来水厂,通道就是自来水管道,缓冲区就是你家的缸(或者盛水的xx容器,例如你的肚皮O(∩_∩)O)。要想读取文件内容就好比自来水厂需要通过管道把水送到你家水缸= =(我这半吊子水平也就能解释到这了)。

  另一个重要区别就是nio是线程异步的,意思是你家有一个水缸,但是你可以选择从不同的水管接水。这里有个新的因素参与,就是你(或者你老爹老娘)决定了从哪个水管接水,决定者就成了选择器O__O "…

三个核心:

Channels通道  Buffers缓冲区  Selectors选择器

当然还有一些其他的乱七八糟的类。。。。。。

附一张Channels的类图:

java nio探险

附一张Buffers的类图:

  java nio探险

额,Selectors先不记录了。

一些概念:

想要撸代码,还得了解缓冲区的几个概念,不然铁定懵逼。说白了就是buffer怎么用。

position:缓冲区的位置,如果缓冲区为空就是0,如果赋值了该位置,则针对buffer的操作都会从你设置的位置开始读取或写入

capacity:缓冲区最大可容纳多大

limit:缓冲最大限制

mark:缓冲区能够记住一个位置并在之后将其返回

额外说一句,这四个变量是全局变量,线程不安全,你懂的。

然后上三个方法的源码体会一下:jdk描述的很晦涩,看源码应该很好理解了。


//反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为 0。如果已定义了标记,则丢弃该标记。
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
} //清除此缓冲区。将位置设置为 0,将限制设置为容量,并丢弃标记。
public final Buffer clear() {
    position = 0;
    limit = capacity;
    mark = -1;
    return this;
} //重绕此缓冲区。将位置设置为 0 并丢弃标记。
public final Buffer rewind() {
    position = 0;
    mark = -1;
    return this;
}