00:00
行,昨天呢,我们主体上讲的都是L流啊,虽然呢,我们涉及到这个类呢比较多,但是呢,大家也感觉到了,基本上都是以相比较相同和相似的方式实践数据的一个传输,哎所以说这一张呢,其实难度上一般啊,不算太大,我们看一下这五道问题,第一道题说明呢,留的三种分类方式,哎这个呢,所有同学都应该清楚啊,既然呢,我们这一章涉及到这么多的流,这么多的类,哎拿到一个流得能够区分出来,它到底算是从不同的角度来看是什么流,哎这个呢需要掌握啊,找同学来说一下吧,哎说这个问题啊,哎王贺,哎你说说三种分类方式,输入流,输入流这是按照这个流的叫流向是吧,哎,等一下啊,输入流,然后输出流啊,然后按照什么流,呃,字节流,字符流。
01:00
是按照处理的,叫数据单位啊,就是以什么为最基本的单位啊,分成叫字节流啊,字符流啊,好节点节电流和处理流啊,这呢算按照叫流的一个角色吧,哎,这样的不同啊,叫节点流和处理流,那什么叫节点流?嗯,节电流呢,应该叫直接作用在文件上的,就直接呢,我们就给它这个构造器的擎参,就是包一个文件是吧?哎,然后处理流呢,哎,就是哎包流,包在这个已有的流的基础之上的,它不一定包的非得是一个节点流了,比如说我们说这个buff分的缓冲流,缓冲力里边我们可以包的是一个转换流,转换流里边包的又是一个节点流,嗯,那这外边的这个缓冲流呢,其实也叫做一个处理流是吧?包在已有的流的基础之上的这些流,我们哎称作呢叫处理流,嗯,行啊,请坐啊,那这三个呢,大家都得清楚,哎,这就能说出来啊。
02:04
然后下一个写出四个L流当中的抽象机类,四个文件流,四个缓冲流啊一共呢,这是嗯,三四一十二十二个这个类啊,但是大家呢,写的时候你发现这个难度也不大啊,就是因为呢,我们这里边呢,是有相应的这个规律的啊,首先四个抽象机类,那我们流这一章的话呢,其实有一个体系架构啊,有个体系架构整个的话呢,我们这些流都是基于哎咱们说的这样的四个抽象积累,当然了,其实有一个比较特别的啊,咱们今天呢,要讲的叫random,哎叫access file啊,这个呢算是一个特例,那除了它之外呢,剩下的这些流都是基于我们说的这四个抽象一类啊,那对应的是哪几个,这个你得知道啊,首先哎,Input stream。然后哎,Output stream,哎,然后reader reader啊,别被reader了啊,Reader reader这这四个啊,然后呢,基于这四个以后,我们下边呢,提四个文件流,其实也很好记,只在这四个基础之上呢,对,你前面加个file是不是就OK了,哎后边呢,就相应的还是我们这几个,哎后缀就OK了啊这呢,我们叫文件流了,那缓冲流,哎,Ber的有个ED啊,就是带缓冲带缓冲的,哎是这种意思,后边也是一样。
03:40
相应的这个叉叉叉这样一组合,哎,这就出来了啊,那么我们同时还讲了,如果我们拿到一个流,大家呢,怎么看它是一个什么流呢?比如说啊,Input stream reader是吧,是个典型的它算什么流啊,哎,那你看从什么角度去说了,或者我们直接说它的副类应该是这四个里边谁啊ER对它的副类啊,是我们的这个reader,哎,这个注意我们是看后缀啊,看后缀这个呢,看后缀的这种思路,其实呢,在JA碍里边呢,其他位置也出现过咱们前面讲过的异常,是不是就这样对吧?你看到是这个叉叉叉的叫except exception这个呢,我们称作叫异常了,哎,你要见到什么什么的,一个叫error,对,这就叫一个错误了,哎,通过这个后缀呢,进行一个区分啊,当然了,也有一些个别的一些特例的啊,哎,这个这个这个我们就不多说了啊,绝大。
04:41
大部分啊,90%以上的啊,或者95以上的,哎,我们都看这个后缀就OK了啊,当然我们在这里边呢,这一章也有一个特例,就是这个rh X access file,咱们呢也会讲到这样的一个流啊,行这呢就我们说的这样的一个体系结构啊,这个大家呢得清楚,最基本的这样的几个流啊,这个呢是四个节点流。
05:03
这个节电流呢,因为前面都加了个file了,所以说我们也称作呢叫文件流,哎,是这意思,下一个说字节流与字符流的区别和使用情境啊,这个呢,其实还可以再出一道问题,就是输入流和输出流的一个区别,或者我们如何去选择,到底用输入还是用输出,这个呢属于一个基本的知识点啊好,那先看这道问题,说字节流和字符流的一个区别和使用情境,诶找个同学说一说。嗯,方间超,那你说说这个文,嗯字节流用于处理非文本文件,文本文件它呢,对,用于处理叫文本文件,嗯,复制操作的时候用那个,呃文本文件,嗯如果要是一个复制,就是我们不在这个内存层面去看哈,只是说把这个文件呢又复制一份了,说可以用这个资金流是吧?嗯,对,就是我们要是控制台显示这个数据的话呢,这个就像这个中文,那明显的就会看到出现乱码了。
06:17
那就是说我们不要呢,去这个读进来是吧,然后复制的时候那个字符流不可以复制那个。非非文非文文件啊成其实呢,就相当于把刚才那个又又给解释了一下啊,就是大家呢,需要注意的就是我们的这个叫字节流,哎,刚才说的其实没有问题啊,字节流的话呢,首先明确一下,就是它就是以一个一个的字节为基本单位的,所以我们看到这个读的时候啊,读的时候呢,它这个方法咱们用的是主体。那主体呢,咱们用的这个不就是一个哎,Be型的一个数组了,这么着的这样啊,即使呢,咱们调的不是这个带参数的啊,调了这个空参的,它返回的其实也是一个字节啊,返回的也是一个字节。
07:07
哎,是这个意思,OK,然后呢叫字符流,哎字符流字节流就是呢,它处理的基本单位呢变了,哎习惯让我们这样写啊,那它也有一个方法呢,就是不带参的这个返回的也是对应的一个character,就是一个字符的意思啊,OK,这呢是他读的这个,这算一个基本区别了,诶刚才呢,这个提到了,就是它的一个使用情境,就是大家呢,这个一定要注意,哎,我们这个字节流它呢主要是用来处理这个叫非这个文本文件的啊,然后呢,我们这个字符流它呢比较特别,字符,字符相当于我们能中看得懂是吧,那主要呢,针对的就是一些文本文件了。对这呢,我们使用这个字符流啊,诶刚才呢,这个细节呢又说了,说就是说呢,如果是一个文本文件,咱们呢,不想在内存层面看哈,就是你别它转化成一个,呃试图转化成一个叉,这个时候呢会出现流量码,呃不是差,呃不是这个转,不是想这个呈现,只是呢,你想从这呢导进呢,呃读到我们这内存里边,紧接着呢就输出出去了,只是做一个搬运,一个复制,这样话呢,其实我们说用字节流也可以。
08:16
哎,是这样子的啊,但是反之呢,你要用磁物流去做这个飞门,这个是怎么做它也不对的,哎,这个要注意这个事儿就行,OK,诶过了啊哎下一个呢,说使用缓冲流实现a.gpt文件复制为b.gpt文件,那对于这种文件比较小的话呢,我们用缓冲流呢,实际上呢,大家也看不出来它有太大的这个速度的提升啊,但文件大的时候呢,你会发现这个速度呢提升呢会更明显一些啊啊这个呢,复制操作作为咱们昨天讲的一个也算是一个重点了,看本来这一章我们说处理这个输入输出的时候呢,它的这个这个步骤都比较相似了,大家呢,就拿一个比较典型的一个去写啊,典型的话呢,你可以诶拿我们某一个这个文件流,或者说你拿一对这个缓冲流啊,作为一个基本的流,你记一记这个流程都是可以的啊。
09:09
简单写一下啊,简单写一下,嗯,我就上来呢,直接就八份的了啊,八份的叫缓冲流用哪个,哎,对,这呢是一个图片了,所以呢,应该用这个字,呃,字节的input stream,哎,New一个buffer input stream,然后在这里边能直接放这文件吗?没有,呃,不能是吧,它没有一个参数,直接就是一个文件的这样的构造器啊,所以你还得去new一个,哎,最基本的一个文件流,呃,Input stream在这里边你去new一个file这样子,那这个file这块呢,哎,这呢你可以把它就看成是一个相对路径了,直接用a.GBG这样就行,那大家呢,也可以把这个new file这块呢给它去掉,整个呢,把这个呢就写成a.GBG也行,但是你知道这个本质上来讲,a.GB。
10:09
指定的也是也是你这个文件的路径而已啊,实际上呢,还得是把它装成一个文件啊这个意思,这呢是一个我们给它读进内存的一个流,然后呢写出去的,嗯,看这一张我们这个类的话呢,还挺长的哈,但其实的话呢,我们写起来难度不大。那这里边类似的啊,在这里边再去一个那b.GPG行,这呢只是两个类的一个创建,那下边呢,要想实现复制怎么办?需要提供一个什么呀?诶,一个字节数组呗,诶,But这个呢,我们就写成比如1024了,哎这么着,然后呢,In LN是吧?哎,Well LN等于bis.read到我们F法里边返回值,看看是不是等于负一,哎这样子。
11:25
那如果要不是负一说明呢,有数据,有数据里边我就bos.right这时候呢,要注意buffer完了吗?对,一定要小心这个0L音,哎,就是你要光写个buffer的话呢,它也确实有这个构造器啊,诶有这个方法不报错,但是呢写的不对,那你读进去几个,我们就给你写出去几个,所以L音一定要保留,那这呢就相当于一个循环,这就执行完了,最后对这个呢,大家写的时候呢,不要忘了啊,关流bos点做一个close,哎,BIS点做一个close。
12:06
行,然后呢,你你好歹你也写一句哈,说此时的异常是吧,哎,应该呢,使用哎,TRY开吃来放在里面,哎来处理这个的话呢,不写扣上三四分啥的应该是很轻松的哈,啊必须得注意这个事儿别死Rose,昨天我写了写了几个啊,但是就是就涂老师写的哈,哎,这个大家一定要注意,Try catch finally哎这个别觉啊,这个肯定不会错,但是你写熟了以后,你老是死肉损,那肯定就出错了,这个在公司当中,这个呃,咱们有这个什么呀,咱们公司有一些老师呢,不是有一些了哈,有个别的一两个老师是什么呢?是咱们这个学生去毕业以后啊,然后去到那个公司,嗯,其中有一家像雅信哈,进来公司以后呢,那公司的项目经理后来发现,诶,就是这个成员呢,这个习惯写的特别好哈,然后后来呢,就是慢慢聊聊聊聊深入了,后来知道啊,商务毕业的,然后再后来呢。
13:07
那他就知道上古了,再后来呢,就把它给挖过来了啊什么意思呢?就是说诶大家出去以后,就是咱们还会强调大家啊,具有一些这个良好的编程习惯啊,就是有一些这种呃,自学的呀,或者是这个怎么着的呀,是吧,然后写代码这个习惯呢,就很差,呃,所以项目经理一看到这个习惯好的,他就特别关注,然后后来呢,觉得商务还比较靠谱,然后他就主动过来了,就啊就是其中呢,当时他过来的时候就提到一个事儿,就提到这个事儿了,说看到这个刚招来一个人,然后诶处理这种流等等这样的问题的时候,发现非常代码写的很规范啊,有的呢就直接Rose了,一看就来气是吧?啊就像这些细节问题呢,大家一定要注意啊,就是现在呢,大家建了代码其实还有限哈,啊,就是一方面是写一些小代码的一些规范上,这就是其中的一个例子哈,再者呢,就是以后你去项目大了以后,你怎么去设计这个这个程序,咱们前面也写过项目123,你比如说像项目三是吧,你怎么去架构你整个这里边这些功能可能呢,大家不同人不同的写法。
14:07
最后呢,程序都运行成功了,但是呢,你这里边是不是有良好的扩展性啊,健壮性啊等等这些呢去考虑啊,不同的人的这个做法可能就不一样了,就像大家解一道数学题一样哈,每个人的思路都不同,那肯定会有一些好的,还有一些一般的,那谁写的更好,更巧妙,更具有更好的扩展性,可读性等等是吧,那就看每个人的这个自己的方式方法了,所以刚开始的时候你就别自己去瞎想是吧,诶你看我这块怎么去设计,怎么想尽可能的进入到我的这个想法里边啊,你要想法不一样,那那正好,诶我的跟你的这样对比一下,你看到底哪个好,诶为什么会有这样的区别,这样去磨合你这个思维啊,这个对你以后呢,还都是有帮助的啊,那再者呢,就是刚才提到这些小的细节点一定要注意啊,别觉得无所谓啊,你要老是这样整的话呢,无所谓,那最后呢,积累多了,就发现这个人的这个习惯就非常不好了啊这样啊,严谨一点。
15:04
好,下一个说呢,转换流是哪两个类分别的作用是什么啊,请分别呢,创建两个类的对象,那转换流这也是咱们昨天讲的一个重点啊,提到了两个类,Input stream reader output,对stream writer,诶这样两个类啊,分别的作用呢?它作用什么呀?将一个输入的字节流转换为输入的字符流,哎,对这个注意啊,这个呢,体验的叫编码解码。想清楚叫什么解码呗,嗯,解码的过程,然后这个呢,是将书。输出的字什么流,字符流转换为输出的字节流啊,因为最终呢,我们存储在硬盘当中都是01010这样的字节了啊,它呢对应的就是编码,哎,这个过程编码解码这个事呢清楚啊,然后呢,让你创建这两个类的对象,主要呢,是想看看你这个构造器的一个使用,我以它为例啊S2。
16:27
S2啊,等于new一个input stream啊,Reader,然后怎么写这呢,是不是得提供一个节点流啊,啊file input stream哎,然后这里边呢,你写具体的这个文件,我就不去new file了,直接写个文件也行啊,那这个文件呢,注意你得是一个文本文件了吧,你可别在这整个a.JPG啊。你就右边呢,这块不要转成字符了吗?转成字符你这哪能拿图片转了对吧?嗯,这是个文本文件,别做了,哎注意主要呢想说的就是这个构造器第一个参数指明呢,我们对接的或者叫套接的呢,是一个普通的节点流了,在逗号后面它有一个变量我们可以指明,哎,就是你这个字节到字符转的时候,到底是按哪种编码集是吧?哎,字符集啊,这个位置要注意一下啊,习惯上咱们就写成一个词缀类型的了啊,比如说我这写谁取决于什么编,诶对,取悦那个文件当初你编的时候呢,你用什么给他存的是吧?诶这个一定要小心一点啊,人家这个文件存的时候呢,拿的是JBK存的,你这时候要读的时候呢,是不是一定得用JBK啊。
17:51
哎,这一定要注意啊,你这要用错的话呢,这肯定就乱码了,哎,它呢取决于人家当时读的,呃,写入的时候啊,就相当于我现在比如说在写这个文件,我在这保存的时候,或者说呢,像这个咱们有一个啊,在这儿不明显了哈,你要是一个tit文件,这个可能还比较明显一些,比如说我这。
18:10
哎,我就随便建了个文件啊,打开以后这呢,我就写了一些信息,包括呢,有一些中文,尤其是这个中文的啊,因为呢,这个英文的话呢,不管在JBK,在JB2312,在UTF杠八,对它都是跟那个阿斯格码那块用的是一样的,那些这个这个对应的那个二进制那个数,所以说呢,在刚才我提到的这几种字符集当中都不会出现乱码,关键的就是这个中文啊,中文的话呢,在JBKJB2312当中,一个中文字符占两个字节是吧,那UCL杠八里呢三个的,所以显然呢,你要是用的不对的话呢,就会出现乱码了,那像这个时候呢,我们写了一些数据,这不我点一个保存嘛,这就会涉及到底层到底用什么这个字符集,或者要什么编码集去存储这些数据了。
19:03
就会涉及到这个问题,那我现在呢,直接点了保存,相当于是默认的一种保存方式了啊,你也可以在这看到,比如我们点一个叫论另存为,你看我刚才呢,存的其实就是哎,符合NSI这个标准的,注意这个是NSI啊,这个不是S码,S码是as cii是吧,这个是NSI稍微有点,这个容易一样化,看成一样的了啊,这是像美国什么标准化这个协会啊,定的一种标准啊,全世界的话呢,都是,后来呢,应该主要的标准都是从这个协会里边出的了。啊,以前呢有很多的标准,这个呢很乱啊,谁都定定这个标准,后来说大家都合并得了啊,就形成一个协会啊这样呢,就对外一个声音啊,那我这儿呢,使用的是它,你也可以呢指明,比如像UTF杠八,哎放到这个桌面上,哎,我保存存在了,我就覆盖一下,诶此时呢,它就按照UTF杠八的这种编码机存的我这个数据,那你这个这样存的,所以呢,回过来我们现在呢想读。
20:02
我想读,那这时候呢,你就得看当初你怎么存的,刚才呢,我们用的u tr杠八,哎,你要想读就得是用UT杠八去读。哎,就这么着啊,那对应的写出去构造器呢,跟这个,呃,也是啊,考虑到两个参数,第一个呢,你就是一个你有file output stream了,写出去啊,你看你想写出去的时候呢,拿什么去写,写出去的话呢,还用考虑参照谁不是不是不用了,Write osw out put stream writer,哎,在这里边,哎,你去new一个file output,哎,Stream,哎在这里边呢,我们指定句定,哎具体的你写出去的一个文件位置啊,比如b.TS,哎,然后在这个位置,哎,双引号这个位置的话呢,我们想写JBK啊还是UTF杠八呀,这个参照谁啊。
21:05
或者有参照吗?没有了,对,就是看你你想写出去的是什么了,对吧?哎,我想换成JBK的,那你就写成JBK呗,哎就这样啊,这就这个过程,这不咱对应的刚才说的叫编码的一个过程啊,编码这时候你看你想用什么编你就用什么编,解的时候呢,要注意啊,解的时候你得看人家当初怎么编的,是这意思啊,就像大家呢,你这个咱们这个这个你看有的那个视频不是也这样吗?这个有的这种视频呢,它加密过或者怎么样的哈,这个呢,你想用个浏览器去读个文,呃,读这个文件是一个视频文件,这个文件的话呢,你你打开像以前暴风影音它会提示说你得这个下载相应的这个解码器啊,主要呢,就是目前呢,这个已有的这个解析方式呢,是没办法去显示这个视频的啊,就是因为呢,他当初这个编码的时候呢,有它特定的一些规则,你得呢,诶能够识别这种规则,提供这样的解码器才行。
22:02
啊,那也可能会出现这样情况,就是呃,这呢是一个文本文件,这个文本文件呢,用的某种编码及编的可能不是UTF杠八,也不是JBK是某一个,那这某一个的话呢,咱们现在呢,想使用word也好,使用这个这个这个比如ID plus也好,想把它这个读出来,读进来,但是呢,比如我们电脑当中没有这种字符集。那你还得去下载这样一个字符集,其实字符集里边呢,就是一种对应关系啊,每某一个字符到底对应的这个二进制是多少,哎,有一个对应关系这样一个编码表啊,你把这个编码表表下来,下载完以后啊,这时候呢,你就可以看了啊,那咱们说默认情况下呢,像咱这个Windows操作系统当中,咱们中文常用的这些编码表它都有,所以呢,大家,诶你有时候出现乱码,你就切换一下哎就好了啊行这呢是咱们的这几道问题。
我来说两句