00:00
好,那咱们还接着回来说,此时的话呢,咱们覆盖的是哎最初的ABC,那我现在呢,把这个呢改回去啊,我要改成这个ABC,我想做这个事儿,做什么事呢?我想在咱们ABC的后面啊,我想在ABC的后面,D的前面呢,让它插入XYZ。想让它实现这样的效果,哎,实现这样的效果啊,就是刚才我这个描述的这个效果怎么办呢?哎,我们这呢,就提到一个新的方法。这个方法呢,就叫做seek,可以指定一个long类型的叫position,就是一个位置指针,哎,相当于呢,咱们默认情况下呢,咱们这个C呢,其实是零啊,是零的话呢,咱们就相当于是从头开始实现操作了,那现在呢,我不想让他从头,我想从这个C的后面,从D这边开始,那这个呢,注意它的这个首索引其实还是零啊,那就是0123嘛。
01:08
哎,三,所以我这个位置呢,可以在这个right之前啊,raaf1.seek,我写一个三,相当于呢,就我们把这个指针呢,就调到啊第三个啊,相当于是角标是三的这样的一个字符的位置啊,啊将。指针哎调到哎叫标为哎三的这个位置,其实是我们第四个字符了啊行,调到这个位置以后呢,我们再去做一个RA操作啊,现在呢,是咱们这个文件长这个样子执行,那大家这个应该也清楚啊,它现在是一个插入的效果吗?是不是不是啊,那它呢,其实把我们这个DEF呢给覆盖掉了啊,也就是说呢,我们这个RA这个操作呢,它其实实现的啊,就是一个覆盖数据的操作。
02:04
啊,它呢,当然呢,前提是你有数据啊,我就覆盖了,那没有的话呢,那其实就是写的意思了啊,那它是一个覆盖的一个效果,那咱们这呢,写的是一个默认行为,就相当于默认的这个position指针呢,是零啊,那你要是调到不是零的位置呢,那就是这样了。哎,那么大家想一下,我如果呢,想在比如咱们这个文件本身就这么长啊,我如果想在后边追加,你觉得有办法不对,你就把这个指针是不是指到那就行,那你怎么知道这个文件末尾啊,对文件呢,是不是咱们当时讲file时候有个方法可以获取它的lengths啊,哎,我调它这个lengths方法是不就找到它的长度了,找到这个长度,长度其实不就是它这个位置呗,就像咱们数组一样啊,数组呢,比如咱们这个写的是五,它其实角标呢,是不是到四了,哎,你就直接写数度点length,其实就相当于是下一个这个位置啊,这个也一样,它呢也是从零开始的啊,你直接写这个,呃,这个文件点LS啊就就可以了,它就能够实现的,就相当于是往后写了啊,这个我就不演示这个事儿了啊,这个大家呢,你下来可以做这个问题,那现在呢,我想演示个什么事呢,咱们现在呢,发现XYZ呢,它只能是对圆。
03:22
文件的一个覆盖,我现在呢,不想让你覆盖。哎,我呢想让你就是实现一个插入,那你说怎么办呀。我就想让这个xa的XIZ呢,就实现插入在这这个效果。这个没有什么新的方法了啊,开动一下你的脑筋,想想怎么办。嗯,对,这块呢,我们就需要呢,你得把后边,因为它本身呢是覆盖文件啊,覆盖这个数据,那你不能让它覆盖,或者你覆盖也行,覆盖之前我把这个数据是不是给取出来呀,哎,所以说呢,我们先呢,把你要插入这个位置,后边这个数据呢,先都给它存起来。
04:16
存起来以后,然后呢,它这边比如说我们把这个啊,我就先CTRLC一下,CTRLC其实也是Windows帮我们做了一个存储了啊嗯,那这个时候的话呢,我们再把指针调回到这个位置,注意啊,就是我们现在呢,去复制的时候呢,这个指针也再往后移,你把后边都复制完以后,指针其实就已经跑到最后一个位置了,接着呢,再把这个指针呢,在C调回来,调到这个位置,然后我们写一个XYZ,实际上呢,是对他仨的一个覆盖。哎,然后呢,我在这儿相当于把他仨呢改成XYZ了,改正以后你再接着这个位置呢,往后写的话呢,哎,你把我们刚才说的那个。刚才那个这个呢,是不是粘过来就可以了,哎,这样的话呢,就能够呈现出来是一个插入的效果了,哎,插入的一个效果行,那想想啊,咱们呢,怎么能够把这个功能呢实现一下。
05:14
哎,相当于咱们是使用哎read file啊让它呢能够实现一个插入的效果啊。哎,它并不是真正的插入,它呢其实就是一个覆盖,但是我们现在呢,希望让它展现出来是一个插入的一个效果。嗯。插入的效果,咱们还以上面这个题目来说啊,这边是首先呢,把指针得先调到这是吧,调到这以后啊,CTRLC啊,把后边这个内容呢,我们得给他这个诶读。读出来。这个我都抛这个异常了啊,我就不去这个try catch了,这个你知道还得应该是try catch finally啊,嗯,这块的话呢,我们需要把它这个后边这个内容给它读出来,但后边这内容的话呢,也不一定就一行啊,你要就一行可能还好办,直接就广读这一行,那可能这个分布在好多行当中,数据呢可能还很多。
06:21
参谋长。哎,对,使用循环了是吧?哎使用循环的话呢,我们就得造一个better型的一个数组,哎,New一个better型的数组,比如我这写个20了啊,哎,In的一个L,好,然后接下来呢,写一个while l等于RF一点,哎我去做一个read数据呢,读到咱这个B里边,哎不等于负一行,那现在这个通过循环的数据肯定都每次都能存到我们的八份里边,那八份里的数据你怎么处理啊?哎,对,同学提到我放个字串里面。可以啊,那字符串的话呢,提前我们造好,当然字符串的话呢,你每次在它上面再去追加,效率差一些。
07:05
用谁稍微好一些,哎,Builder呗,哎,这个呢就就叫builder吧,哎,New一个string builder,这个builder话呢,咱们也看过它的源码吧,以408为例啊,它跟它一样,底层呢,是不是也造了个数组数字长度呢,没记错应该16,哎,这刚才也提示出来了。啊,这不就说16吗,那咱们这个文件如果你要超过16的话,底层是不是还得去扩容啊,啊对,那要扩容的话呢。太不好,那尽可能能不扩容最好是吧,那这块呢,是不是就想办法指定一个长度啊,那怎么写啊,写谁啊,哎,咱们是不是咱是不是可以用我们这个file把它呢放进去。诶,CTRLC放进来,它呢点lengths,它肯定不能超出这个长度吧,那这个呢,得到是一个long类型的啊,咱们再给它cut成一个int,哎,这样就行了,哎,肯定不能超出它啊B呢,我们这块指针呢,是指定个指,指定了一个位置,这个位置你要是从头的话呢,那就是你这么长,你要不是头的话呢,那不会比这个长,所以我们就用这个文件的长度来表示了,OK,那么在这里边,在这里边的话呢,数据都已经存在我们的这个buffer当中了,我们呢是使用咱们这个builder,它这有open的方法。
08:27
那open的方法呢,你找他还没有一个说BAT数组是吧。那没有bed数组怎么办呢?我们是不是可以用这个来,你用一个string把我们这个buffer扔进来,注意这个是不是一定要写上这个参数,用的是我们这个string的三个参数的,那数据呢就放进去了,那这呢,咱们就相当于把这个数据呢后续的啊三后边这个数据呢,都保存在我们这个string builder里边了啊,这个我们写一下啊,说保存啊这个指针。
09:01
呃,三后面的所有数据。啊,所有数据啊,到咱们的string build中。那保存完以后,那么接下来注意这个指针呢,就自动的就跑到最后了,接着呢,把这个指针呢,再调回来。调到我们这个三的位置,调到这以后,那我们RF1.2,咱们做一个right啊,此时呢,你把XYZ呢给它写出去,哎,写出去以后还用再去调指针吗?不用了,这时候你指针不自然而然的就在这个C的后面了,哎,这个呢,相当于咱们啊调回指针。呃,然后呢,呃,去写入啊,XYZ相当于对原有的位置呢,还是一个覆盖啊,那再接着的话呢,我们将呃,咱们的string build中的数据呢再写入。的这个啊数据啊,再写入啊到我们这个文件里行,那这时候呢,我们就raf一点啊,接着去做这个RA就行,Right的话呢,我们这时候呢,拿着这个builder啊builder的话呢,嗯,它呢没有这个get bes了啊,那你直接呢,可以让他先to string一下,得到这个字符串,然后呢再get一个BA词,哎,这就写出去了,那最后呢,关闭一下我们这个流。
10:23
那这样就OK行,这个呢仍然得需要用我们拆开发来处理啊,这块呢,我又偷了个懒了啊用ROS了,那写完以后这呢是咱们目前这个文件长这个样子,现在呢我们执行。看搞定,然后回过来。那你看这时候呢,XYZ在这呢,后边这个还是DEF,哎,这个这个没有变,哎就实现了这样的一个插入效果,哎,这样子啊行,那通过这个点呢,我们这个说明的事儿呢,就是对文件内容的一个覆盖,咱们呢,可以这种写一个四啊啊可以通过啊,通过这个相关的这个操作啊,然后实现,哎,我们RA s file呢是一个插入数据的效果。
11:07
看这呢,我写一个这样啊。哎,插入哎数据的一个效果,那很显然我们想插入这个数据这个事儿其实还挺耗内存的啊,尤其呢,你想想我们这个文件如果特别大,你想在前边的某个位置插入一个数据,后边呢都得缓存起来,然后呢再把它塞进去,再把后边缓存的内容再写出去,这个呢肯定是效率呢要差一些。啊,要差一些,所以通常呢,我们在数据这块修改的时候呢,一般都习惯上去爱做追加啊,不爱做这种插入式,因为效率呢比较差啊行,这呢咱们就用这个string build呢做了一个解决啊啊做这个解决,那其实呢也可以不用string build,哎,我在这个课件里边呢,给大家又放了一个流叫BAT RA output stream,这个我就不想讲了啊啊这个流的话呢,以后有同学呢,写代码的时候呢,有可能会用到这个流啊这呢我写了一下这个流的一个使用啊,这是方式一,方式二,这个呢,主要在方式三中去体会了。
12:11
哎,就是咱们我就说一下这个原理是什么啊,咱们呢,把刚才三后边这个数据呢,储存在咱们的string build当中,String build里边呢,实际上是造了个数组,哎,这个数组呢,这不就是以它呢这个lengths指明的这个数组的长度了,那么这个叫BA output stream,这呢也是一个输出流,这个输出流你会发现我没有去指定文件啊什么的。啊,这个流啊,其实就有点类似于咱们的string builder啊,它里边呢也提供了一个数组,大家呢也是这样写,你看啊,也是这样写,哎,我也往里边去读write write到哪了,实际上是write到我们这个流里边那个数组里了,其实就跟咱们这个我写的write方法,其实就类似于我这里的end。哎,这呢可以做成一道思考题,哎大家呢,你可以下来呢,试着去,相当于是给你这个知识点,你自己呢去研究啊,以后大家工作当中这种事情多了啊,不是所有的这个代码,所有的这个类啊,框架都讲过啊,可能会有一些新的框架了,是吧,那你得自己能够去研究啊,这呢思考说呢将哎我们的string builder。
13:23
哎,大家呢,可以去替换为,哎,咱们的叫BA瑞。啊,Better reor,哎,Put,哎,Stream,哎,你可以试一试啊,你看你会不会做啊,这呢我给了他的一个基本的使用,实际上呢,也比较简单啊,OK,那这样的话呢,我们关于这个叫RYXFL啊这样的一个类呢,其实就讲完了啊,那这个类的话呢,哎,我们提到它两个主要的特别之处,第一个它既可以作为输入流,又可以作为输出流,第二个它跟其他的这个流呢不太一样,它呢可以实现对文件内容的一个覆盖,而且它有一个非常好的方法叫做seek。
14:05
叫做四个方法,那么这个方法有什么好处呢?首先说我们讲其他的流的时候呢,没说过。还没说过其他的流,咱们说嗯,你要么呢是不是在文件末尾去追加,要么呢是直接是不是把这个文件整个就覆盖了,诶而我们呢不一样,我呢可以深入到这个文件内部,看看你想从哪个位置开始去写。啊,那它的意义是什么呢?诶大家你想一下,我们去下载一个文件。这个浏览器本身呢,它也有这种下载的功能,呃,有的时候不知道大家有没有这样经验啊,比如我们用浏览器下载一个,比如说Windows的一个系统吧,或者你想下一个很大的一个软件,你会发现呢,如果你这个网不太好,你就下了一点,突然网断了。网断的时候呢,这时候你就点一下这个开始按钮,一点开始它能给你续传吗。
15:04
这个浏览器啊,浏览器是不能的,就是你这块一点的时候呢,你会发现呢,它又从头开开始给你去,诶重新的开始去这个下载了啊,那其实就有点像我们前面讲的这样一些理由,就是呢,诶你这文件呢,其实还没有传完啊,但是你现在呢,又重新的去操作,原来这个文件呢,其使你已经下载了99%了,但很遗憾,这个文件呢,我没办法深入到你这个代码层面,或者底层文件层面呢,给你把后边这个数据呢下载好,我只能是对你整体做一个覆盖,所以呢,他就从头给你下载了,这就很恶心了,但是呢,大家呢,平时你要下载这个电影什么的都有什么呀。嗯,这个,呃,以前呢,都还用这个快播是吧?嗯,快播没有了,呃现在呢,有的还有这个迅雷,那迅雷下的时候呢,这个你应该也都用过了哈,这个呢,你要是下了一半了,没有网了,或者说呢,你这时候呢,这个就不想下了,回头呢,你某一个时间又想下了,这个时候呢,是不还可以接着续传,而且呢,迅雷你会发现说下载的比较快,那其实咱们可以理解为比如我这有一个G的文件。
16:14
这一个G的文件,其实我可以给它切成好几块,比如说切成四块,切成四块的话呢,我们一个G,或者说你具体是多大的这个字节,我们除一下四,你是不是可以找到,你就相当于把它看成个数组一样啊,哎,我是不是可以找到每一个这个起始的位置,嗯,那我就相当于可以开四个线程,每个线程哎咱们呢,是不是让它里边提供一个RA xx file,然后每一个线程里边呢,拿这个对象我去seek,这呢头头这呢是指定的这几个位置,然后好吧,开始让他们四个线程同时的去下载,那么下载到一半这时候呢,突然网没有了,那么这个时候网没有的时候呢,我紧接着呢,让你去记录一下,当时你你现在写到哪了啊把写到哪了这个事儿呢,再存储到一个临时文件当中。
17:04
哎,当你下次再去下,我呢,从那个文件里边读出来,你到底之前下载到哪了,我再把这个C的指针调到你当时写到这个位置,再接着往后去写,所以还可以操作原来的这个文件。啊,就是这样一个情况啊,那下边呢,这不我也写了这样的一个啊,一个例子啊,就是我们呢,在进行这个多线程断点下载的时候呢,我们会发现呢,它会创建两个临时文件啊,第一个临时文件就是我要下载比如说一个G的电影,先呢帮我们创建了一个文件,这个文件呢就是一个G,就是先呢把这个一个G的空间呢给我们开辟出来,那接下来呢,我们就像刚才提到啊,假设四个线程,我就找到各自的C的指针位置,开始呢去传另外一个临时文件呢,就专门来记录我们这个指针的位置啊,以防呢你万一没下完,没下完的话,我得给你持久化起来啊,当你下次呢,再接着下,我从这个文件里边把你那个指针下载到哪呢?调出来,接着往后传,哎,就这样个事情啊,哎,我们可以考虑用这个类呢去实现。
我来说两句