00:01
NIO还提供了另外一种比较特别的buff法,叫map的。By buffer这个听这个名字啊,大家看map映射的意思,什么意思呢?可以让文件直接在内存中进行修改,也就是说这个时候呢,它可以不用拷贝,那这样呢,相当于说是在对外内存对我们这个文件进行一个修改,从而而而如何同步到文件,只有NIO来完成,所以说这个map的bit buffer呢,它的性能还是比较高的,我们来看一下。做一个案例。新建一个架构类,我们看一下叫map。Bite buffer。好,跟上我的思路。那怎么来做这个工作呢?我们来写一下。好,我们首先对这一个map buffer做些说明。说明第一点就是map的buffer,就是在一会我们要讲的map的buffer。
01:03
这个咱们取个名叫test吧。哦,我把这边名字也改一下。Map的b test把名字修改一下哈。Test,好的,这样就没问题了,那么这里面的它这个map的buffer在哪里呢?我们先来看一下它在什么地方。走一个。同学们可以看到map的。Bit buffer呢?它实际上是继承了bit buffer,那我们来看一下它下面还有哪些东西,从这里可以看到它的继承关系,它的父类是bad buffer。仍然是从拜巴尔过来的,它下面呢,还有。一个子类就是director。By buffer,还有一个direct by buffer r,这是可读的,对不对,所以说实际上呢,它有这样一个关系,这样一个关系好,那明白这个关系过后呢,我们来写个写几个案例,写一个案例来进行一个测试。
02:05
首先我们说一下map的buffer。它的一个好处是。Web barber。可以干什么呢?可以让文件。啊,可以让文件干什么呢,直接。让文件。直接。在内存中修改,内存修改。对,这样呢?操作系统并不需要进行一次拷贝,即操作系统。系统不需要。不需要,不需要什么呢,拷贝一次。这就是他的一个最大的特点,最大特点那么我们所说的直接文件直接在内存修改,那么这个内存指的是什么内存呢?好,这个内存指的是堆外内存。对外。
03:02
对外内存好的,那现在我们来举一个例子,看一下它是怎么操作。首先我们利用一个random,这里面我们要用的是random access file。对这个,然后这里面我们首先来指定我们要对哪个文件进行操作呢,待会我们就对T,也就是说我们待会呢,对1.t文件进行一个直接的修改。后面写上一个模式,我们写RW,代表读写。我们就拿到了random这个random access file。同样这里呢,它会产生一些异常,我们就直接把它抛出去啊,不做不做处理。拿到它以后,下一步该干什么呢?获取。获取对应的什么呀,文件通道。因为我们仍然是NIO嘛,所以说还是把它的通道要拿到获取它的通道跟前面是一样的guide channel。
04:03
VR我们拿到这个通道就可以了,拿到通道以后,下一步呢就可以通过,因为你现在这个通道呢,是跟我们这个random access file进行关联的,说下一步我们就可以直接操作了,怎么操作。点。点map。这里面大家可以看到这个map的方法呢,首先第一个填的参数是它的模式,第二个position,第三个size,那么我分别做一个说明,我们先写第一个啊,先把模式写清楚,模式呢就是我们这样一个fair。什么呀,Channel?点它的map。China map model。点它的我们,我们选一个什么读写的模式,Read right下面的第二个参数,我们写零,第三个参数,比如说我写一个五,那么呃,写一个五,我说一下这个含义是什么,好,同学们看。
05:04
我对我对这这个函数,就是我们对这个map这个函数做一些说明,它的每个参数代表什么意思呢?参数一。就是同学们看到的第一个参数。这个参数表示我们使用是使用的是读写模式使用的。使用的是读写读写模式。第二个参数就是我们说参数二。参数二这个零代表什么呢?诶零代表起始位置,就是可以修改的,可以直接修改的为起始位置。起始位置。好的,那下面还有一个参数三,参数三这我不是写了一个五吗?这个五表示什么呢?表示的是我映射到内存的大小。
06:00
是映射到映射,这个映射映射到。到内存的大小,什么映射到内存的大小呢?就是我把这个文件的第几个字,第几个位置啊,就是第几个位置映射到里面去,也就是说我最多可以映射它的五个字节。明白我的意思吧。好,所以说这个地方呢,我们要注意一下啊,就说映射的位置就是G。即即什么呢?即可以修,可以即将。将文件哪个文件呢1.txt。的多少个字节多少。多少个字节映射到内存,映射到内存,那么当然你映射到的内存有多少个你能够修改的呢?也只能在这个范围里面修改,也就是说即可以修改的在可以可以直接修改的范围就是什么呢?就是我们所说的零到五。
07:07
那么包不含包不包含这个五呢?同学们注意啊,这个地方呢,我们能够修改的,能不能包含这个五,待会我们可以试一下,就是包不包含这个五。啊,同学们也可以想一想,同学们可以想一想好包不包含,那现在呢,我们来试一下,我们现在呢,进行这个修改,修改的时候就是这边它会map的时候呢,同学们看整个它会返回一个对象。AVR看返回的对象就是我们的map的,就是map的bit buffer,好,我就用这个名称哈,那现在呢,我们就调用它相关的方法,点第一个put方法往里面放,放的时候大家看到put方法是进行重改的,第一个是你去修改映射的第几个位置,当然是按BAT来算的,看后面是BAT,比如说我写一个零,然后呢,这边我们给它改成一个H,假设我改成一个大写的H,当然我要转了。
08:05
转成BAT没问题吧?好,第一个就改完了,那么我再来改一份。比如说我要改一个三这个位置,我把它改成什么呢?改成这一个大写,改成一个九啊就就就九吧,写完了,写完过后映射就完事了,完事过后我们再关闭。这一个文件。好,我们看一下此时此刻,呃,我们能不能把它改修改成功呢?到底改成什么样子,大家看,首先现在的文件先看清楚了,是hello word,那待待会我们这个文件操作了以后。就刚才写的这个操作以后,他会把第一个位置。改成大写的H,把第四个字节就是改成九,也就是说说再直接一点,就是你这个地方会改成大写的H,而这是一个两个三个,在这个位置改成一个九,我们看是不是这样子的啊,好的,我先关闭它。
09:08
关闭它,那现在呢,我们来运行一下。运行一下看看O不OK,我这提示他一句修改成功。啊,修改成功。同学们,我们运行一下。Run一下。好的。让一下。弄完了过后呢,我们可以看这边有提示,他说修改成功,修改成功过后,我们打开这个文件,我们发现没有变化,诶这就有点奇怪了,为什么没有变化呢?实际上这个文件已经变化了,只是你在这打开它没有及时的刷新,那怎么办呢?同学们,我们在外面把它打开,你们再看一下。好,现在呢,我用这个方式,呃,找到文件的所在地,然后呢,我们在这打开。用另外一个程序把它打开,同学们看有没有变化呢?OK,你看这个是不是变成了大写的H,而第四个位置,因为我这个三其实指的是第四个位置,因为它索引是从零开始的嘛,那这边就变成九了,没有任何问题,修改成功,好,那修改成功过后,我们再回头再来看一下这个。
10:13
这个方法首先我们来看这个map的,呃,Bit buffer呢,它是一个抽象抽象类,所以它实际的类型是什么,我们先来看一下它实际的类型,显然是要从这边找了。对不对,它是是哪个呢?是directory,呃,Director direct by buffer还是下面这个呢?我们来看一下,我们先定进行一个bug。来运行。这些地方呢,大家都需要注意的哈,来我们往下走一点,走一步过后我们看它的类型,我们可以看到它的类型其实是direct direct by by buffer是这个东西,所以说这里面大家明白了,是这啊好,那么继续往下走,往下走这个下面我就不走了啊,下面就不走,现在我们再来探讨一个问题。
11:03
我这儿写写。实际类型是实际类型。它实际的类型是哪一个呢?实际上类型是这个。对不对,是他。好放在这,另外一个我们来探讨一下,你这个五写到五,那第五个位置能不能改,他这个五指的是索引五还是大小五啊,我们来看一下这个东西啊,来我们改,我们来改一下map。店铺。所以说如果我直接写个五,我来改一下他会干什么呢?同学看我又我又修改,比如说我想把第六个,它下标为五,其实就是第六个位置了,我想把它改成另外一个大写的Y。看此时此刻会怎么样呢?我先可以告诉大家,这样做呢,会有一个会有一个异常,抛出什么异常呢?来预习一下。来运行一下,我们可以看到此时此刻它怎么样抛出了一个印场,这个印场就是index out of bos遇界。
12:04
那换言之,就是我们这个这个地方的五呢,是其实并不是代表修改到索引为五,而是最多修改五个字节。那你五个字页,其实你最多修改的下标其实就是四了,明白这个意思吧,所以说这个地方它会越界,越界,那么我们来从事这个五,它是映射到内存的大小,并不是索引啊,是大小不是索引位置。索引位置。好的,同学们,那关于map的,呃,Map的bit buffer呢,我们就给他家聊到这,它的好处是什么?同学们再说一遍啊,就是别人问到你map的bad buffer,它的好处就是它可以让文件直接在内存中修改,就是我们说所说的对外内存,而操作系统不需要把我们的文件拷贝过来,它是一个操作系统级别的一种修改性能会比较高。好,那么这个我们就说到这啊,就是我们所说的这个map的buffer就说到这。
我来说两句