00:00
好,那么这个呢,我们就说清楚了啊,接下来的话呢,我们就具体来讲一下这个流的使用,刚才说了我们先来演示一下这个字符的一个使用,相对来说呢,咱们比较形象一些啊,好,那么回过来以后呢,我们就来看一看,首先呢叫fairer和R的一个使用了。这个reader呢是一个输入流,它呢是一个输出流,咱们先来看一下这个输入流的一个使用。啊,输入流的使用好,输入的话呢,我们得有一个文件呀,按照这块我们就得整个文件啊,整个文件首先我们在当前的,诶咱们这个里边哈,我呢先右键咱们去新建一个文件,咱们就叫做file reader,哎,我这呢再加个叫writer。就是我们这两个流的一个使用的测试啊,好,这块我就用单元测试了。这我要用单元词的话呢,我们默认的这路径呢,如果用相对路径来表示,就是当前的这个module了。所以呢,我就在这个下边啊,我首先右键啊,去新建一个具体的文件了,比如这个文件呢,我就做hello.tt。那就它了啊好,然后这里边儿呢,咱们学点东西啊。
01:02
我就写个叫哈。Word来个123吧。啊,保存一下。好,完事了啊。好,这个写完以后呢,回过来,然后这块呢,我们想做什么事呢,把这个文件里边的这个内容,注意,这可是磁盘中的一个文件了啊。把这个文件中的内容啊,咱们读到内存当中,然后呢,比如说给他输出出来。是吧,就这个意思。好,这是我们这个需求。给我写一下啊。哎,需求说呢,读取。哎,咱们这个文件中的内容。啊,然后呢,显示在这个控制台上,诶这样就可以了。其实呢,就是你读到内存当中,然后给大家out一下就行,好,那这块我们就得看如何去操作这个事儿了,整个呢,我们这一章呢,涉及到这个流啊会很多。哎,但是大家一点都不用紧张,或者换句话说,这一张相较我们前面的章节呢,还比较简单,因为呢,虽然这个理由很多啊,他们基本上一个输入一个输入,这样配对使用,它的操作呢,是非常规范的。
02:09
那也就意味着呢,只要呢,我们把其中的一组讲清楚以后,大家会写了,其他的这些组呢,一个输入配一个输出,基本上呢,大家按照这个套路来就都错不了啊,所以这块我们也可以写一个这个说明啊,说本章。诶,虽然诶涉及到的这个流啊很多,诶但是使用流。啊,使用这流呢,我们来进行。诶,这个数据的一个读写操作呢,是非常标准和规范的。啊,2G呢,就是只要我们会一组,其他的呢,套路都差不多。好,那这块我们就以file reader和writer呢,我们来说这个事儿啊,那这块看到了啊,我们要想把这个内容呢,给它读进来,首先你得有对应这个内容的,或者这个文件的一个对象。
03:00
这就咱们所谓的叫万事万物皆对象,哎,咱们刚才呢,讲过了这个fair了,所以首先呢,第一个操作呢。哎,我们相当于要创建一个file类的对象。啊,是不是就对应着咱们这个哈点体文件。好,这正是我们的第一个事儿啊,好,那么第二个事儿。啊,咱们先把这个。哎,这个流程呢,写一下啊,有了这个file号以后呢,哎,咱们下一步要做的事呢,你不是要把它内容读到控制台上吗?这个呢,我们就得需要创建个流了,哎,去读这里边的内容了,那我们是输入流还是输出流呢?哎,输入流,哎,因为现在呢,我们这个数据呢,是在这个磁盘中的文件里呢,这呢是我们的程序或者内存需要呢,把这个数据呢读进来。哎,所以这呢,就是输入流啊说创建。啊,因为呢这呢是一个文本文件了啊,里边呢,都是一些具体的文本数据了,所以我们用字符流诶创建输入型的字符流。说用于读取数据。
04:02
行,这个第二步呢,我们就把这个流呢,就造好了,然后第三步。啊,流也有了,文件也有了,万事俱备了,下一步呢,就是我们具体的读取数据的过程。哎,读取数据,然后并显示在控制台上。啊,这就显示了,那这个事儿呢,做完了其实就完事了,但是我们这块呢,还一定要写一个四对,这呢,就涉及到我们这个流资源的一个关闭操作。关闭操作啊,这个呢,我们说呢,必须要写是吧。哎,必须要关闭说,否则会。内存泄漏,咱们前面说过这个事儿了啊,就因为呢这个流呢,它需要跟磁盘中一个文件交互,还有一个引用了,你光把你自己这个变量呢给干掉之后还不行。啊,必须得关一下啊,要不就资源呢,就不会被JC给你回收掉了啊,就泄漏了。好,那下边我们就来写这个事儿了啊,哎,第一步啊,File file,哎,你有一个具体的一个file,这呢,我们用的相对路径啊,单元词方法相对路径啊,就是在这儿是吧。
05:06
直接我们就拿回来了,好,第一步搞定了,第二步,诶我们需要呢,去new一个叫file reader了。哎,这么着一放是吧,然后在这个位置呢,CTRLP一下,我们呢就可以传一个file。哎,所以呢,你就把这个file呢,CTRLC啊放这。然后这块我们就得到了一个它的对象。啊,比如说叫F2了啊好这块呢,它可以抛个异常,那咱们暂且呢,就把这异常呢都Rose出去先。哎,Pod异常就是你这个文件呢,可能找不到。OK啊,好理呢,也有了下一步。哎,是不是该读这个数据了。读这些数据的话呢,这会儿我们就想,诶这该怎么去读啊,哎,看一下我们这个API了。进来IO下的这样一个流啊,然后往下走,这是构造器啊,刚才我们用的是第一个啊,然后再往下的话呢,哎,他说呢,使用了一些相关的一些结构的方法了。哎,那由于呢,我们这个file reader呢,它是继承于啊,或者叫间接的继承于我们这个reader,这个reader呢,就定义了我们该如何去读的一个标准了,所以这块我们其实呢,咱就看一下它上面这个reader里边的方法吧。
06:12
这个reader这个方法呢,往下走。啊,下边这个方法,哎,我们读数据,读数据其实你也能想到了,就是read了是吧。这个瑞的话呢,你发现呢,这里边儿有好多重载的方法了。那到底用哪一个呢?哎,我们先用一个最基本的体会一下,最基本的就是这个方法。每次呢,我们就读一个字符。哎,读一个字符,然后返回的,注意是个int型的值。哎,应对性的值,其实呢,就是我们这个叉呢,它对应的这样的一个值的。OK啊好,那这块read是不是就返回的,返回的就是我们当前的这样的一个int型的一个值,这个值呢,是零到6535。啊,65350~6535,其实呢,就一共是6536个数就是二的十六次方。二十六次方不就是哎,两个字节吗。
07:02
28次方乘以28次方呗,是吧,两个字节。诶,Be的话一个叉,那不就是两个bet吗。OK啊,那就这个范围的一个数了。行啊,那这呢就比较清楚了,哎,还有哈,说如果呢,你这块要是读取到的是负一,说明我们这个文件呢。啊,这个流呢,已经读到这个文件的末尾了。所以呢,根据这个返回值是不是负一,咱们判断呢,是不是读完了对吧。嗯,对的好,回过来那这块呢,我们就开始去读了哈,比如F2点,我们就直接呢调一下这个叫瑞的方法了。这个呢,就读了一个字符,那读了个字符的话呢,我们看到它的反问值是个int性的是吧。那要印的行,举个例子啊,咱们就先跑一下啊,哎,这个有异常,咱们以alt加回车,先给它抛出去。啊,它是一个IO的,刚才那个是file not found是吧,是它的一个此类了,所以直接呢就抛了一个负类了啊,但是这块我们看到呢,它实际上是个int值,我们给它强转成个叉吧。
08:00
就这样了哈,好走一下。行,你看这时候H就出来了,那这块呢,这个思路呢,其实就清晰了啊,再走一个,再走一个,再走一个,我就先整四个啊好按一下。哎,你看这是我们这几个字符就出来了。相当于这块,我们这个read方法呢,一定要调用多次了,那我们就自然而然的想用一个循环来写啊,那循环的话呢。哎,如果呢,要用for循环,你得告诉我几次for循环的话呢,你就写一下这个。哎,什么时候呢,不满足这个条件就行是吧。哎,这块其实用well比较合适啊,要写well的话呢,这块大家你想我们这个位置怎么写。对,刚才我们看到了什么时候就不能继续往下读了呢?就是你的结果是负一的时候。是吧,哎,你看这个我们怎么去处理啊,哎,我先这么着吧,先F2呢,我们先去read一下。哎,先读一个啊,然后这时候我们得到一个叫data。然后这时候我们判断是这个得塔呢,它是不是负一。如果你要不是负一。
09:00
哎,那这时候呢,我们就先把它打印出来是吧。这个打的时候呢,其实前面我们得来一个叉了。这个呢,就不要换行了。好,这就相当于H呢,就出来了啊,H出来以后呢,接着是不是再得读一下。哎,我们接着就F2点再去read一下。然后呢,诶这时候在瑞的话呢,其实就我们这个E了。哎,这不就是我们这里边儿的。哎,我这么着一下啊。哎,这个数据盯一下啊好回过来,哎,第一个的话呢,我们把H读烂了,这块再去调的话,其实就这个E了,E呢看是不是负一,不是负一打印。走走走走走三呢也出来了,也打印了,打印完以后呢,再去读就负一了,负一在这块负一了退出了。哎,所以这块呢,就能打印成功。好,暂且的话呢,我们就可以先run一下看看。看没问题。啊,这个呢,是非常的完美的啊。好最后呢,记着我们这个资源呢,还是要关闭一下的啊,诶我们需要F2点做一个close的一个行为嘛。
10:00
那就可以了啊行这个呢,就是我们这个程序的一个核心的一个逻辑了。哎,这个逻辑写完之后的话呢,你可能会想说这个你看这read一下,这块又掉一个read,感觉好像有点重复一样,是吧,能不能给它合并在一起。不能啊,能不能那我就不用说了是吧。嗯,哎,这叫方式一了啊,这呢合并在一起看一下。哎,方式二啊,这个呢,我这样写啊,就是in特型个德塔,我就先声明到这儿,然后while。哎,我就先让这个data呢,使用F2点调这个瑞的方法呢,你给我做一个。做个负值是吧,负完值以后呢,我看一下你是不是负一。哎,这样写,然后里边的话呢,我们就直接再去打印一下就行了。你看跟跟我们上面这个其实是一样的道理。你看data塔过来了,先呢,让F2去read一下付给data塔,然后呢,整个这个结果呢就结束了,看一下data呢,是不是负一不是负一打印打印完以后再回来再read一下再给他,他再看是不是负一再打印。
11:03
跟上边这个逻辑呢是一样的。这两个呢,在执行上呢,没有效率的区别,就是写法上呢,稍微的少写了一次它而已啊。哎,你愿意这样写,你就这样写,你要愿意这样写,那就这样写,这都还可以啊。这呢是我们讲的这个事儿,这个说完之后的话呢,我们得紧接着说一下了,因为呢,这里边儿涉及到资源的一个关闭了。所以呢,我们用Rose的这种方式呢。差点意思是吧。你比如说我们在这个read这块呢,刚才看到它可能会抛异常。那如果说这个代码呢,就正常往下走,走到这儿了,首先这个流呢是创建了啊。然后读的时候呢,出现IO异常了,直接呢就死死出去了。这个导致我们这流就没关是吧。哎,所以呢,我们应该使用。诶拆开是finally,是不是来处理这个。异常的问题是吧,所以呢,我把它呢CTRLC一下。啊,我们在这稍微写一下啊,说呢异常使用,诶Rose这个。
12:01
呃的方式处理啊,不太合适。啊,所以呢,我们就要见啊这个。咱们叫这个TEST2是吧,这个。操作了。来,我们把它呢复制过来。这个我们改成这个叫二啊,这个呢,我们是使用。哎,Try catch这个finally的方式来处理异常,然后呢,确保咱们这个流呢。一定可以关闭,避免。内存的一个泄露。好,那这块呢,我们就把这个操作呢,给它就诶删了啊。删完以后的话呢,我们这边来看,为了要确保它能关,我就要把它放在番类当中吧。所以我们就从这块开始,一直到这儿。包起来。啊,这个包的话呢,咱们讲过有快捷键,记得不。Ctrl out加个T。哎,这块呢,我就想使用一个叫try suddenly的结构,我就点一下了。
13:01
啊,就过来了啊,这个位置的话呢,我们就1.printsta吧。那就可以了啊好,然后因为我这块包的时候呢,没有包,它相当于我外边还要用F2,它会自动的把这个F2呢,就给我们放到外边。啊,这个呢比eclipse呢要好一点啊,Eclipse的话呢,就还得自己弄一下啊。好,这个呢,整到外边以后呢,我们再把这个操作呢,往上提一下是吧。哎,就放到这里边儿就可以了。好,但是它呢还有一场,那我们再alt加个回车使用,拆开呢给它处理一下。啊,这样好,这样写完以后的话呢,我们说还有一个小的细节。为了让这个程序的健壮性更好一点,这咱们上面讲我就把这个就删了啊。怎么着呢?诶你看啊,如果说我们咱先分析下当前这个线程安全问题啊,不是线场安的问题,这个呢,泄露的问题啊,就不会出现了,比如说我们是在这个位位置呢,出现异常了。这个呢,我们就在这给开始了。
14:01
开完以后呢,由于你这个流呢已经创建成功了,所以这个close呢还是会做的。所以呢,就不会出现泄漏问题啊,哎,但是。如果说呢,这个位置出异常了。哎,刚才我们不是看到这个位置有个叫file not found exception吗?它这个位置要出异常的话呢,意味我们这个流呢,就没有创建成功。哎,这块呢,你要是在这块来处理了以后,这个没有创建成功,就意味着它还是no。哎,你直接呢,就冒失的进来掉,Close就控制人了。所以呢,为了这块呢,间容性好一点,我们加一个判断啊,说if f2呢。或等于你再去close。啊,也不影响你这块呢,如果出异常呢,调用,然后上面要是没创建成功呢,它也不会去调啊,真的也不会出现控制帧。这个大块呢,我就给省了。哎,就这样的情况。好,这个呢,就是我们这道题算是比较标准的一个写法。哎,就这样来处理。来,我们做一个执行。哎,完全没有问题。啊,这是可以的,好,这个写完以后的话呢,马上我们需要对它做一个升级操作。
15:06
哎,CTRLC。啊,粘过来。哎,这个我们写成是一个三,哎升级的话呢,往哪块去升呢?哎就这么几步是吧。啊,关闭操作没啥可升的了。一个创建对象。哎,创建流。啊升级呢,你说把这个造型匿名呢放到这儿那也行,但是那也谈不上说效率上有什么变化是吧。那这块核心的操作呢,就是这个三了。诶三这块呢,我们说有必要呢,给它重新的改一改啊,为什么要改呢?因为我们每次呢,就读一个字符是吧。每次读一个字符,我说这个性能太差了。啊,有的人说这个读一次循环几次,嗯,也没什么区别啊。注意啊,从这呢,咱们给大家指出来一个区别点。咱们前面讲这个时间复杂度on呐,这个on方啊,这个O,这个log n呐。
16:02
咱们说这个时间复杂度呢,是不一样的。显然呢,这个最好,这个其次,这个再次。注意这块我们在讲的时候呢,都是在内存层面。跟这个,呃,整个我们处理数据的这样一个数据量呢,是有关系的,这个呢会更好一些,这块呢都是在内存同样这样一个级别层面,看谁好谁坏。那如果涉及到了我们这个数据哈,你要是直接呢,CPU呢,这个数据呢,来源于内存,这呢是一个维度,如果说这个CPU我们去读写这个数据呢,是先得从磁盘。是吧,先得从这个磁盘呢,把这个数据先读到内存,然后内存呢,再回到这个CU这块去做运算,注意这块呢,咱们原来提到一个词儿啊,你可以说呢,叫天上一天地下一年。啊,这个内存这块呢,处理速度呢,是它的上百倍。啊,那你说我们要是跟磁盘呢,交互一次。哎,读进来我又交互了一次,跟你人家就交互一次去比,显然交互一次是不是要快很多了。
17:05
对,所以说我们这块呢,讲的时候呢,说啊你这个好,这个不好,这还都是在内存层面,在整体呢,其实都算是内存上比较快的情况下呢,看谁更好,但如果说你要再跟磁盘去比,这都毛毛雨了。说你这个好,你这个不好,我这多交互几次,你这都啥也不是是吧。就你这块呢,我们可能比的时候,这个是零点几的区别,你到这儿我直接上来就是十点几,你0.1秒,这个是花了这个0.05秒啊,你说你这个好,我这上来就多十秒。你这个都显不出来,这个有什么区别了。所以这块呢,我们要想能够提升整个运行的一个速度,怎么着呢,少跟磁盘去交互。那就意味着我们现在读的时候啊,我现在每次读一个字符,每次是不是得跟他交互一次。那交互好多次,那最好呢,是不是我少交互一下。那怎么办呢?我就每次多读几个呗。所以呢,回到我们这API层面,哎,往前走一下,哎,我们这就有个这样的一个方法。
18:01
哎,我每次呢,哎,把这个数据呢,读到这个差型的数组里边。这个数组呢,其实大家就可以想象成咱们快递小哥的那个小车一样。说现在呢,我有好多这个快递呢,需要送到,比如咱们这个校区啊,这个每次这个小哥的话呢,每次就送一个包裹过来,诶送完一个之后呢,再回去再取一个,再再送,就类似于我们刚开始写的这种方式了。这个显然呢,这个性能太差了,他干脆呢就开个小车。这个小车的话呢,就是我们这个插营数组。这个车大还是车小,就看你这个数组的长度了。假设呢,我们这个数的长度呢是五,那就这块呢,就咱们也假设呢,它就只能放五个包裹。哎,那就这块呢,假设这块包裹呢,诶有13个是吧?诶那第一次的话呢,放满了来一次,诶把五个呢卸下来,然后呢再过去,哎,再把五个呢都装进去啊,然后再过来,放满了第三次过去就剩仨了,装仨就行,再过来一趟三趟就可以了是吧。
19:00
啊,就OK了。啊,那同学说说,我这块整个15个的一趟不就可以了吗?诶那是咱们这块不得,这个本身文件也不大,咱们这块呢,整的小一点,让大家感受一下有好几次嘛,对吧,那个文件有好几个G的,你总不至于把内存全占完吧。是吧,你得哎。小一点是吧,好这块的话呢,我们就有一个数组一个概念,减少呢,跟磁盘交互的一个次数了。OK,推过来啊,这呢,就是我们这块优化的一个点啊,这块我们。在这写啊。啊,对。哎,咱们这个T2呢,进行优化啊,然后每次。读取多个字符,存放到啊字符数组中。啊,然后呢,提升效率。哎,这个提升效率原因是什么呢?我们说呢,叫减少了与磁盘交互的次数。OK啊,提升效率行,那这块我们就回到这儿来了啊,咱们把这个代码就完全的给它删掉了。
20:03
哎,刚才提到了,说我们得有一个小车呀。是吧,我们这块就整一个小车呗,这个习惯上我们叫c buffer了,Buffer就是一个缓冲区的意思,C呢就是差的意思啊好,这块我们new一个叉,咱们假如这个小车呢,就小一点,因为毕竟咱们这个数据也不多啊。好,这就写了个五,然后呢,我们把这个数据呢,是不是就要读到这个小车里啊。好,那我们就F2点的。哎,然后呢,就用这个啊C。哎,就把数据呢,就写到这里边儿了。这时候呢,就相当于是尽可能多的往这写,那咱们这数据多,这个呢,少是不是就写满了是吧。写满的话呢,这个方法哎,它也有一个返回值。诶看这哈说呢,它的反应值是the number of characters read。就每次呢,读入到我们这个小车里边的这个字符的个数。啊个数返回或者呢是负一,那就意味着我们这个读完了。
21:00
所以这块我们还是拿这个是不是负一来判断是吧。哎,那我们这块呢,前面呢去接收一下,注意这个时候我们得到呢,不是一个说读的这个数据了,因为数据都放到查询数组里了,它返回的是我们读到这个小吃里边几个。哎,我就印了一个叫len吧。然后这块呢,我们就判断是L是不是。负一吧。哎,如果他要不是负一,那说明就写进不进去了啊,读进去的话,我们就可以把它取出来了吧。这个叉形的一个数组取啊,咱们就是一个叫便利数组吧。注意for I这个位置呢,哎手哎,一激动就是点烂了,对吗?不对了是吧。哎,你是不是应该读进去几个,你就读出来几个是吧。哎,假设呢啊,我这块我就写上它了,写上它以后呢,这个时候我就在这呢,去输出一下啊,输出呢,咱们就哎C8我就来一个角标I了啊。
22:02
哎,这呢是对应的,我们这样一个叉啊,这不就输出是吧,哎,这样一个循环操作,把这里边呢,就都给它打出来了,打出来以后注意我们这是不是还得接着读。那接着呢,是不是再拿着LN等于F2点瑞的进去,C8法是不是就得这样了?那这样写又写了两次,那干脆。改一改了啊。看能不能行啊,在这个位置要整个小括号。我让L1呢,就等于。这个事儿。放这了啊,那这块呢,这块就用它的先默认值。啊,先不要给它赋值,他在这儿呢赋值。哎,把这个值呢,读完以后给了它,看看它是不是负一,然后呢,里边判断完之后呢,这个也不要了。这不回过去接着去读完之后接放接着放到这里边儿吗。那就这样个情况啊。好,那这个呢,我们通过这样一个循环就完事了,然后最后呢,关闭一下这个资源。行,看一看我们现在这个O不OK啊一下。
23:01
啊,大家看。我们本身这个数据呢,是长这样的,现在你发现它后边多了点东西哈。这个能理解吧。嗯。咱们那个小车能放五个是吧。第一次的话呢,是不是把哈呢就给放进去了。然后第二次的话呢。就把word给放进去了,注意这个word就把之前的这个helo一个一个的给覆盖掉。第三的话呢,我们再读就剩仨了。所以呢,这个三个的话呢,是不是你这写的是叫WL是吧,然后呢,第三次的时候呢,我们是是一。二三。没有动是吧。哎,所以呢,你这时候你再去便利的时候呢。哎,这个你就得小心了哈。哎,咱们编历的时候呢,你看我这写的是一个叫Les是吧。遍历数组的长度,那你123可不LD会出来啊。所以这块你看就多了一个他。
24:00
不太对是吧,那怎么办呢?对,你这个位置呢,就不能写它啊,所以这儿呢,我们注意这是一个错误的一个写法。哎,把这个呢,我们在CTRLC。哎,拿到这儿啊,这个呢,咱们注释掉这个位置一定要小心不要写LAS啊,这个呢要写。啊。哎,因为你最后一次呢,就剩仨了,所以我们只读三个啊,来我们把它那run一下。哎,你看这时候就对了。OK,好,那这时候呢,咱们相当于呢,就使用这个file,咱们实现了一个数据的一个。啊,没问题啊,这呢,就算理解成咱们的一个最终的写法。好,那么这个file reader呢,完事以后,哎,我们现在就可以呢,把数据呢,想再从内存中写出去,这就是另外一个需求了。诶,这个有输入的一个经验之后呢,我们这个输出呢,哎,其实就会比较顺利了,哎看一看这个大家呃需求。哎,怎么着呢,我们是将哎内存中的这个数据。
25:04
啊,写出到指定的这个文件中是吧。哎,相当于我们用writer来写了吧。啊,比如我这呢,写一个叫四。OK啊行,那么这个操作话呢,想让我们这个步骤。第一个。哎,咱们现在要写出去是吧,相当于我们仍然要创建file类的对象。哎,指明要写出的这个文件的。名称是吧。啊,这是第一个啊,然后第二步呢。哎,创建是不是叫输出流是吧?哎然后呢,这块我们就哎看你要输出到,哎,就是输出的这个这样的一个主角了啊第三个。是不是叫写出的一个具体过程了。哎,这个你往外写就行,然后最后呢,关闭资源,哎就可以了。那有了上边这样个经验之后呢,我们看看啊,首先啊,来一个file file,诶,你有一个具体的file。
26:05
哎,这么着啊,比如说这块呢,我们写一个叫infer.t啊,写出去好创建输入流,这呢是我们文本数据啊,是一个字符的,所以我叫file writer。哎,这么着啊,你一个file writer里边呢,就可以放一个具体的一个file了。好,没问题,有异常先抛一下。啊,我先抛一下啊好,然后下边呢,我们就是具体的写出的过程了,这个数据呢,就来自于咱们内存中,那我就直接在调咱们这个叫write方法了。这个RA的话呢,你看你发现呢,它可以呢,去写出一个字符串,也可以写个差生数组是吧?哎,这呢就是我们典型的两个方法啊,我在这稍微写一下啊。诶,输出的这个方法。哎,这个方法呢,一个叫right string类型的。啊,这样的一个字串。或者的话呢,你使用一个叫right是叉型的一个数组。
27:02
哎,这样也可以啊,好,比如这块呢,我们就写一个字串吧。说这个比如I啊,哎。啊啊。这是一个啊,那这呢,我们在比如这呢,来一个换行吧。是不是可以这样是吧,好,再呢,我们去一下。啊,再写一个是吧。这个呢?嗯,Love him是吧?啊,然后再来一个啊,我们来个right。啊,太惨了是吧。啊。哎,行啊,就这样了啊好,这样的话呢,我们把这个数据呢,就写出去了,写出以后呢,最后把资源关闭一下。啊Fw.close一下啊好,你其实整个来看的话呢,这个步骤你看比较简洁,不像我们输入的时候还有循环啊这呢,因为你就是想写什么,你就往外写呗。哎,就可以了,行完事了啊,完事以后呢,注意。
28:00
从上往下看啊呃,首先的话,我们说这个事吧,异常的处理按说不能用los是吧?啊把它呢处理掉啊,从这到这包一下ctrl alt加个T。啊,是finally。啊。哎,把这儿呢,往上一提c shift上这样。哎,这个我们也讲过,Out shift上。嗯,Out shift上呢,它这个不会跟我们缩进是吧。哎,你看我要在这ctrl shift上呢,就直接给我们就缩减进去了啊。好,然后这个有异常,Ctrl alt,诶CTRL加回车,然后呢,再来一个try catch。啊一点,哎。S啊,然后这个位置我们再来一个是吧。哎,不等于一下ctrl al再加个L调试格式。完事。啊,这都是套路是吧?哎,写熟了大家就都好写了。嗯,可以了啊可以了,以后呢,我们就想运行一下了啊呃,运营这块的话,我们在这儿啊写一个啊,比如说叫输出成功,这呢是写到咱们控制台上了啊,你说我现在运行会成功吗。
29:06
哎,担心的一个点,你看这个文件呢,目前不在。我们刚才输入的时候呢。这个文件我说呀,得一定得在。现在的话,你看我们去run,这人就读到我们控制台上了,这没问题,如果你这块写成HELLO1了。这个文件有没有?没有这块你读是不是肯定就not found了?就找不着了是吧,所以呢,对于输入流来讲呢,这个文件呢,一定要在啊,那输出呢。现在没在没在,咱们试一下啊,走起。诶这句话呢,出来了,说明我们这个程序呢,从这走走走走走都没出异常。走到这儿了是吧,然后呢,诶往这一看呢,诶还有了。有了是吧,那一打开呢,也有。哎,那就说明呢,我们这个输出的时候呢,这个文件呢,是可以不在的,然后它会自动的帮我们去创建了。
30:00
哎,这个事儿好,再下一个问题啊,你说我们文件要是在呢。在这块,你比如说我这块,我就。那随便我就整整点儿是吧。你说我这块呢,要是在的情况下,我再去运行怎么着呢。有几种情况是吧?第一种,比如说呢,对这个文件覆盖了。啊,第二种。对于内容覆盖的话呢,可能是比如说从头开始覆盖的是吧,那我这块多写点。因为你多的话,你覆盖你覆盖不全,我不就能看到我这块剩着这个东西了是吧。还有什么可能性吗?啊,在后边追加是吧?啊对这也是一种可能性,还有吗。啊,我报错啊也是一种可能性是吧,诶也就这么几种情况,好,那这块呢,目前是长这个样子的哈,咱们这留一个证据哈,好下边呢,我们在存在的情况下呢,我去run一下。也要成功,首先呢,没报错啊,然后呢,我们这块呢一点开。
31:04
这叫什么?什么覆盖?盖对文件覆盖是吧,他是对文件内容覆盖的话呢,应该会留点后边的东西了。哎,这个呢就清楚了。哎,所以这块我们就知道了,它是如何去做了,当然这个呢如何去做呀,其实呢,主要取决于我们使用的构造器。哎,主要举属于构造器的哈,这个我们现在是这样写的哈,或者的话呢,我们还可以呢,这样去写这个位置呢,我们来一个叫force。哎,这俩呢,其实是一个意思。那这个false你看这个pen就是追加的意思啊,我不追加啊,这个呢就是false,就是它俩呢,其实是一个意思,如果呢,我们要是使用还是这个构造器,我要把它改成是一个处呢。这个呢,就是在现有的文件,如果要是存在的情况下呢,我们就追加内容了。哎,所以呢,你看暂时我们当前不是长这样吗?随便加点是吧,这个光标在最后了,我们再去做这个run。
32:01
哎,这时候你再打开,是不是就在这后边看去追加这个内容了。OK啊,所以呢,在这儿我们稍微说一下啊。啊,这个呢,我们是,呃,覆盖文件的这个。呃,覆盖文件来使用的这个构造器。OK啊,然后下边这个把这个我们说明一下啊,这是在现有的文件基础上。嗯,追加内容。诶使用的这个诶构造器啊,诶咱们呢,一般情况下呢,都是覆盖文件了,所以我就把上边这个呢,咱们打开啊,作为一个主要的一个场景啊好这呢,就咱们说呢,这个输出的一个行为了。哎,这个呢就完事了啊,这个完了以后呢,诶,这个咱们稍微的再。多说一点啊,你看这个输入也讲了,输出也讲了,那我们能不能再提一个过分的需求。反正俩合一起是吧。诶,从一个文件当中把这个书里面读进来,读进来以后呢,内存里边你实际上是可以操作的啊。
33:05
比如说你把它变变化成大写啊,啊,就是字符串的各种操作都可以做啊,做完之后的话呢,我们再把它写出去。啊,如果我们内存中不做的话呢,比如说就针对这个hello,这个T文件啊,相当于我们叫复制一份。诶,Hello,点文件。啊,然后呢,命名为。比如叫hello。诶,这个下划线叫copy点这个事儿看会做吗。实际上呢,就是输入流,输入流是不是合在一起啊。来这个咱们快速的写一下啊。这个我们叫五。诶,你看到目前为止呢,我们这个流的处理的这个步骤啊,其实都比较规范哈,第一步呢。创建file类的对象是吧?啊,对于我们现在呢,有一个输入的一个输出了,这是不是就两个对象了。啊,细节我就先不多写了啊,第二步呢。
34:02
哎,是不是叫创建输入流和输出流了。哎,这样啊,好,然后第三步。数据的一个读入和写出的过程。哎,第四步。关闭流资源诶。没问题啊好,就这几个事儿,首先第一个啊说呢,我们就发一下这叫FILE1吧。或者叫src也行,原文件啊,哎,你有一个。这呢,我们就叫做hello点。诶,这是它啊,好复制一份目标的那个叫copy。这个呢叫dest destination目标的这样的一个文件啊。好搞定了下一个创建输入流,输入流。啊。Reader。啊,F2啊,你有一个叫。哎,把我们这个src是吧,扔进去。
35:02
如果这个src呢,你觉得不是特别形象,你可以在后边再补一个叫是吧。哎,这样一些也行啊好,这个呢,就是叫原文件。哎,这个写完以后,我们还有叫R。哎,这个呢,叫death的这个。好,这儿呢,就已经开始呢,去报这个具体的这个异常了哈,诶我们暂且呢先都Rose出去,诶这个呢,报的还是一个IO的。成这样了啊?好,再下一步呢,就是这个读入和写出的过程了,读进来写出去,咱们说呢,读进来的话呢,别一个一个读了太慢了是吧,我们整一个小车哈。快递小哥的这个小吃了。哎,八分,哎,你有一个差声数组。这个呢,咱们就别写太长了,因为这个数据呢比较短,咱们多少让他循环两次是吧,你整个15的话,一次就循环就不用了是吧。那咱们整个五啊好,然后呢,我再来个L音,回忆一下他是干嘛的。
36:02
对,记录每次读入到啊,这个C8中的。字符的个数。是吧,诶这个呢,就是咱们那个快递小哥这个小车了啊好来外号循环。L音呢,就是F2呢,你读进到这个小车里边。记录一下呢,读进去几个好当呢,要不是负一的时候。说明里边有东西了。我接着呢就要写出去是吧。嗯,这个数据呢,现在已经在我们这个CB里边了啊,我就想把这个数据呢给写出去,注意Fw.right确实呢有一个这样方法。但这个方法行不行?就说这个。对,这个呢,就好比是咱们上边写这个的错误的行为一样。哎,我要直接呢把它写出去,其实呢,就把这个里边的所有的内容都写出去了。那其实呢,我们说呢,有可能没读进去那么多是吧,所以呢用它呢不合适啊,诶这块我们还有另外的一个啊方法。
37:08
哎,我在这写一下啊,这个right呢,它除了放这个叉型的。这叫数组之外啊。它呢还有一个呃角标,这个角标呢,就是T型的,就是from这个index,然后呢,这个叫诶T型的一个叫to。哎,不是这个呢,是叫L音了是吧。要烂死了啊。你看这会儿我们CTRLP一下。嗯,这个。哎,我这儿呢,你想写出去,把这个数组中的数据呢,写出去,从这个位置开始。写写这么长个。啊,所以这呢是一个L音,不是一个to index了啊好有这样的一个方法,那我这块呢,我就把咱们这个c buff呢,就这样写了,然后呢,我这从头开始写呗。写L各是吧,哎就这个意思,哎,他呢也有异常啊,异常我们这块都已经都抛过了啊,哎,这就写出去了。
38:00
啊,然后呢,这块写完一一轮之后呢,回过去再读一轮,然后呢,再得到L1,再去往外写,直到了你这块呢,是负一的,哎,就进不去了,就完事了。诶好,这个过程,哎,然后呢,这块我们要关闭这个流资源了,一个输入一个输出先关谁。啊。都可以。没有要求啊,所以呢,哎,你就关就行了啊。哎,就这样,哎,我习惯上关的话呢,我们现在就有两个流啊,回头呢,要这个流多的话呢,一般关我就习惯上就从下往上看。就是习惯这样诶,从下往上这样关了啊,所以这样写了好,这个完了以后呢,很显然呢,就不能用lo了。哎,你把它去掉,然后呢,这时候你再把它这样到这包一下啊,很重要的替一下。诶,TRY开始。1.print,然后这两个啊小心一点啊,放进来都有异常咋办?
39:00
哎,就是这个,如果要是出异常了,我们保证它也得关掉。诶,同时我把这个呢,写到他的track的那个finally。啊一点就是这块,我再整一个finally是吧。然后呢,把这个扔进去。啊,怎么着?这不挺好吗?就是你这块呢,要关的时候出异常了,我保证我这也能关。可以哈,这个不就是这个叫方式一吗。啊,但是的话呢,我们此时呢,其实你并列着写,其实是不是也行啊。诶看一下啊,这个我们叫方式二了啊粘过来,诶我呢就直接呢,把这个CTRLX,那你把这个发你就删了就行了,我我这样。就是你这块呢,要出异常了,你处理完以后,不是下边代码也能执行吗。啊,其实也行是吧。哎,这块呢,稍微小心点,把这个if呢加上啊。哎,他呢?
40:00
不等于闹哈。If。诶,它呢,诶不等于no,诶control加个L。啊,这个咱们上面这个,这不是也得就上面这个写法也行啊,这你得给他补一个啊。不错位置了。这儿啊。哎,这样啊。好,这个呢,补一个这个啊,CTRLC。诶行了啊好这呢,我们就把这个相关的这个资源呢,给大家就关闭掉了,诶前面这块呢,我们也处理掉了,诶整个呢就诶写到一个具体的文件当中,文件呢不存在也没关系啊,我们呢会自动创建好,此时呢我们做一个软。这呢就成了,哎这呢我你也可以写一个叫复制成功哈,在我们的这个位置。诶复制成功是吧,好,那这块已经生成一个文件了,你把这个文件打开你看。完全是没有问题的。
41:01
诶,大家写的时候呢,刚才你看我说过这个事儿哈,这个方法呢,一定要用对了,这是一个正确的。啊,那你要是用错了的话呢,比如说写成这个了啊。点我就写了个C,这个是不是不对呀。对,这个你看我要是做运行,把这个文件就覆盖掉了。这时候你再打开我们这个文件,是不是多了LD了。哎,对,所以这块呢,要注意它是一个错误的哈。这个错误呢,就跟咱们上边这个读的时候呢,那个场景是一样的啊,所以用这个啊,这个我再稍微再跑一次啊。嗯,行完事了啊行,那整个这块呢,我们关于这个呃,读写整个这个过程呢,就说清楚了啊,诶简单的我们把这块做一个总结啊,首先呢,你想想整个这一章呢,我们说处理呢,都非常的规范啊,第一步呢。创建。啊,这个读取或写出的这个file类的对象是吧。
42:02
哎,这第一步,然后第二步呢。哎,创建啊,你这个输入流或呢叫输出流啊,然后第三步呢。哎,就是具体的这个读入或写出的这个过程是吧,然后这个过程里边呢,我们比如说要读入,咱们用的是read的方法。暂写呢,咱们都是一个叉型的一个数组。啊,用的都是这样的一个方法是吧,哎,那要是写出呢。哎,我们用这个right里边呢,你可以把这个内容呢,直接都写出去,这是一个方法。哎,还可以呢,这个right呢,我们是X型的一个数组。哎,咱们更多用的呢,其实是零这个呢,是一个L啊,这个用的多一点啊好。哎,这呢,就是我们相应对应的这两个写出的这个方法了,哎,第三步完了,还有。哎,第四步叫,诶关闭流资源。啊,关闭流资源,然后避免。
43:02
哎,内存泄漏是吧,整个呢,咱们这一章呢,涉及到这个操作呢,都是这样的一个标准的操作,哎就是我们后边用的理由不一样了啊,哎,第一个呢,你仍然需要告诉我起点和端点是谁,还得有fair的对象,哎这个流呢会有变化,然后读写的话呢,都是这样的方法。只不过呢,你肯定留着这个对象不一样了,这个方法呢,都重写了他们抽象机类里边的方法了啊,哎,他呢,就各自的这个读写的方式有区别,但是呢,方法名跟行三呢都一样啊。当然了,你要是自节的话呢,就是BAT数组啊,然后这块呢,正常的还关闭那就行啊,稍微的这个注意点啊,比如第一个这个我们提到过哪个事儿呢。啊,比如说啊,因为啊涉及到啊这个流资源的一个关闭操作。啊,所以哎,出现。啊,这个叫异常的话。嗯,我们说呢,需要使用叫诶try catch finally。
44:04
这样的这个方式。啊,来处理一场。啊,这是我们说的第一个点啊,然后第二点,哎,咱们想说一下呢,关于这个的一个问题。是吧,哎,我们说呢,对于输入流来讲。哎,我们说呢,要求这个file类的对象。哎,它呢,就必须存在是吧,哎,否则会报。叫fair not found。Exception这是它哈,然后呢,对于输出流来讲。哎,这个咱们怎么说来着。哎,这个我们说呢,这个file类的这个对象呢。诶,这个呢,咱们这样说哈,应该是要求file类的对象对应的物理磁盘的文件是吧。啊,对应的物理磁盘上的这个文件啊,必须存在啊,对象呢肯定有是吧,这个呢,要求呢,就是范围类的对象,哎,它呢对应的物理磁盘上的文件呢。
45:10
可以不存在。是吧,它是可以不存在,那么具体来说啊说呢,如果此文件呢不存在。哎,那我们说则呢,在输出的过程中会自动创建啊。哎,文件。啊,然后呢,哎,并输出或者叫并写出这个数据。呃,写出这个数据啊,到此文件中,OK。啊好,下一个哈,说如果此文件存在呢。对,如果此文件存在,哎,那么我们说呢,使用。哎,这个就看你这个构造器了啊,咱们如果呢,就使用这个writer,这里边呢,就放了一个具体的一个。File是吧,哎,这个构造器或者。哎,咱们使用的这叫。
46:01
Writer。哎,这呢,你放了一个file,一个file之外呢,这块我碰的呢,你写了一个false是吧。哎,这种情况呢。诶,我们会对信仰的文件来进行覆盖是吧。诶,这个输出数据。哎,过程中,然后呢,会啊这个新建同名的文件。啊,对,现有的文件。来进行覆盖。那就这个事儿啊,这个我们有点长了,哎,往回拽一拽啊。我就这么着一下好,那接着的话呢,说如果你要是使用的。哎,是我们,哎还是这个构造器哈,但是你现在呢,是用的这个参数呢,叫做处是吧。那这个时候呢,我们说呢,呃,输出数据的过程当中,会在现有的文件的基础之上呢,追加内容。哎,现有的这个文件的末尾。是吧,诶追加。哎,写出内容。
47:00
诶,这呢,就是我们这样的一个过程啊,行,然后这块的话呢,需要大家关注的就是我们主要的一个读写的一个过程了,稍微的这个细节啊,大家呢,下来也捋一下,那file reader file reader清入以后呢,下边这两个流整个操作过程啊,操作步骤,其实跟我们前面讲的这个字符流的它俩呢,基本上都是一个套路,这一章的话呢,其实基本上也都是一个套。哎,所以呢,这一章学起来其实相对来说要轻松一些。
我来说两句