00:00
大家好,我是海波老师,我们之前给大家讲了一下,咱们从文件中读数据呢,可以用支付串的方式来读。那么我们往文件中写数据呢,也可以以字符串的方式来写,对不对?但是大家注意啊,咱们的字符串在我们加入中,它可是一个对象的概念呢,哎,那么我们现在就能不能把一个对象从我们的程序中写到文件中,反过来我们从文件中把这个对象取出来行不行呢?哎,我们告诉大家这是可以的,哎,老师,那这是为什么呢?咱们之前的字符串能写到文件当中,能从文件中读出来,那是因为我们字符串的底层是我们的字符啊,而这个字符呢,可以用字节来表示,对不对?那肯定没问题了。那咱们的对象可以吗?我们说对象其实也是可以的,因为啊,我们的对象都是通过类创建出来的,而我们的类在编译之后呢,其实就叫自解码文件,那么也就意味着我们通过自解码文件来构建我们对象的时候,它在内存中存储的其实也是用自解的方式,那么既然都是这样的话,那么咱们文件中保存我的字节,那肯定就没问题,对不对,只不过它的那个管道就不一样了,所以这里能把图给大家画一画啊,咱们这里呢,稍微的咱们的变化一下来我们这里干嘛呢?首先咱们拷贝一下。
01:14
OK,以后大家看一下,我们稍微的跟之前有点不同,我们这里啊,就不画这个东西了啊,我们这个都不画了,把这个拿过来,把这个去掉,把它去掉,现在咱们要画的是什么呢?画一个对象过来,这下咱们这里放过来,放过来以后我们Java中的一个对象,哎,所以把这个拉大一些,拉大以后我们给它一个红色。那这里我们解释一下,它里面呢,就是我们的object吧或者U吧,咱们写上一个user对象。点上一个U的对象以后,大家想想,我现在就把内存当中所保存的U的对象,我通过一个管道给这个管道,咱们稍微的拉长一些啊,咱们拉长一些,把这个地方诶放到这来,放到这儿来以后,我们的箭头,诶咱们拿过来,诶我的对象呢,就通过这个管道把它写到文件中,我们说这是完全可以的,所以啊,咱们接下来就讲一下这个管道的问题,那这个呢,比较特殊。
02:06
那这个呢,咱们首先要讲的就是一个out对吧,把对象从内存中给它输出到文件中,那么你反过来啊,同学们,你们要注意了,我们也要读取操作呀,我现在把数据读过来对不对,所以说我们这里呢,哎,拿过来,拿过来以后把这个咱们放过来啊,把它咱们拖过来,这个咱们就叫印了。它就叫印,那我们就可以把我们的文件中的数据再想办法读成一个文件,这个其实也是可以的,对,咱们复制一下,复制以后大家看一下,我们现在呢,把这个箭头呢,我们复制一下啊,回过来到这边也是可以的,对啊,咱们这个对象的这个操作呀,就有这样的一个处理过程了,这样的话呢,我们就给大家解释一下,在Java当中有一个专门的术语,什么意思呢?如果把内存中的对象通过管道的方式给它写到文件当中,那么就等同于把我的对象变成了我的字节,一个一个写进去,那这个过程我们称之为叫序列化过程,所以啊,咱们用文字的方式给大家稍微写上一下啊,咱们称之为叫序列化啊,把我们的对象变成我的字节,哎,就这个意思了。
03:11
那反过来,如果把我们的这个文件中的数据再给它读成我们的对象,这个呢,我们称之为叫反序列化。所以啊,在我们Java中有这样的两个概念,一个叫序列化,一个叫反序列化,我把这个范围呢,给大家说一下来,咱们这个括号,这个括号呢,我们来说一下,哎,放到这边把这个去掉。对了对了之后大家看一看,我现在呢,把这个包起来啊,包起来这个过程我们就称之为叫反序列化,同样道理,我们的这个过程啊,来把这个拖过来。过来以后我们这边放这边啊。好,我觉得可以了啊,这个过程我们称之为叫序列化,行了,我们的这个概念呢和图形呢,我们分别的说了一下,接下来我们把代码我们写上一下,首先我们这里呢,拷贝新的,我们拷贝,拷贝以后呢,我们来写上一个叫零七,零七放在我们这里呢,就把这个去掉了啊,咱们写上它叫object啊,文件复制完成以后,我们打开,打开以后呢,把这样改成我们叫做序列化啊,还有我们的反我们的序列化,然后呢,我们的这个文件保留一份就可以了啊,咱们保留一份,我们就把这个这个去掉吧,嗯,这个去掉。
04:21
去掉以后呢,我们这里就写上一个叫object啊,咱们叫叫date吧,不叫数据文件啊,我们那个文件里面保存的是我们的数据,就这个意思啊,这个地方我改一改啊,把这项去掉,我们叫做什么呢?叫做我们的object点。这个dat啊,就表示的意思啊,没有什么特殊含义,你改成别的也没问题,我这就是简单一点了啊,然后这个呢,就是我们的一个什么,我们的数据文件对象,所以把它去掉,数据文件对象,哎,行了,写完以后呢,咱们接着往下,往下以后我们看这个图,我们应该有一个out吧,这个out没有它了,把这个去掉啊去掉去掉以后我们就写上叫对象输出流,咱们叫对象输出流。
05:03
那你对象输出流的话,这个名字啊,咱们就写上它了啊,咱们叫做什么呢?Object,咱们叫output,诶就是它,所以把这个来咱们改个名,咱们叫object,咱们叫out就可以了啊,诶把这个去掉啊。好了,写完以后这个印我们不要了,然后呢把啊咱们拷贝过来,拷贝过来以后把这个咱们复制。复制完成以后,那么这时候呢,它有报错了,把这个去掉,去掉以后给大家解释一下,首先咱们的这个流啊需要什么呢?它需要输出嘛,所以我们这里还是需要一个文件输出流,所以我们再来写上它,咱们叫fair。可以把这个叫fair output streamam,所以我们这里写上它就叫out也没问题啊,行了,然后呢,把这个out呢,我们拿过来,它等于new,我们叫fair output stream,然后呢,把那个我们的数据文件传过来。那个数据文件咱们给它放过来,好放过来完成以后把这个out呢,我们放到这里,哎,这样的话就可以了,廖老师,那你这么写完以后,那么我们这个当前地方怎么去具体的写入对象呢?我们这里就全部删掉了,咱们全都不要了,全都不要了以后啊,咱们准备一个对象,我们准备对象的时候,我在下面呢,我先写上一个叫class,我们就叫做嗯UR吧,好写完之后你把这个U我这里创建一下这。
06:25
咱们叫U啊,等于new,我们叫做U好点完了之后,那么我们现在有一个对象是用来输出对象的,所以拷贝它就把我这个对象按照我们的管道啊一个一个流过去就可以了,那么这个时候大家看一下,我们找一下,它就有一个什么呢,叫做right object在这。要写对象,把这个对象呢,我们传进去不就可以了吗?诶就这么简单,那么写完了以后不要忘了,我们在这边,我们给它来,我们写它,我们叫flash,可以把它刷写一下,对吧,最后呢,把它关闭就可以了,所以呢,这里来把它关闭啊,把它关闭下面就不要了,好都去掉。
07:02
都去掉了以后,诶,那你这个行不行啊,你能不能把咱们的U给它写到这个文件当中呢?对不对,我不知道,咱们试一试,咱们点击右键,我们来看一看运行。运行以后看结果。哎,报错了。他报了一个什么错误呢?他说了叫not so legable exception,从这个字面函上来看,他说了叫not,不能吧,对不对,叫sable,叫不能序列化,诶老师这什么意思啊,你刚才提到概念了,说我们这个地方啊,叫序列化,他说不能序列化什么意思,很简单。我们刚才给大家讲过了,我们的对象要变成字节之后再写到文件中,可是这个变字节的操作你做了吗?你没做,那你没做的话,那他怎么可能写进去呢?啊老师这个还要我自己做呀,那咱哪会做呀,那咱不会做的话,那你不行啊,对不对?你要不会做的话,那这个对象怎么写到文件当中呢?
08:00
我告诉大家,其实我们确实不用去做,为什么?因为我们的Java虚拟机它可以帮你做,但是有个要求,什么要求你得告诉我们的Java虚拟机这个对象,当咱们写文件的时候,它需要变成字节,它不能把我们程序当中的所有的类全都变成字节吧,它只能加了个标记的类才能做,那所以呢,我们就说一下,这里补充一下来。我们的Java中啊,Java中它只有增加了啊,咱们叫特殊标记的对象,或者说类吧,咱们的类才能什么呢?才能在我们写文件时啊,写文件时啊进行我们的序列化操作,所以啊,这个需要大家注意一下,你说加特殊的标记,那什么是特殊的标记呢?非常简单,那么这里的标记其实就是一个接口,把这个接口当成一个标记好,咱们写上一下,那么在这里呢,我们叫做实现。诶,我们有一个叫feel legable,你只要加这个标记他就知道哦,我写文件的时候,我要把它变成字节,来吧,咱们运行一下试一试啊,来把这个删掉,删掉以后我们delete。
09:12
好了,那么我们现在呢,把这个地方执行,然后呢,我们运行一下看结果。运行以后看结果还出错吗?不出错了吧,我们这里的这个数据文件是不是也出来了,你出来了以后你双击一下。里面是不是有东西了,你看不懂是看不懂,但是里面有东西了,诶老师呀,那现在我把一个对象我写到文件中好像没问题了,那么我们回到这一步来,你这个地方能不能反序的话,把它的读成对象呢?我们说也是可以的,所以我们回过头来把它关掉,关掉以后咱们来啊,咱们接着写图图。咱们从我们的文件中读取数据,转换成转换成我们的对象,我先把这个就注掉了,这个呢是我们的一个写的过程,我现在要完成一个读的过程,那么这个读不用说了,也是需要专门的管道对象,所以呢,咱们接着写来,写上它,嘟嘟,咱们叫做对象输入流啊输入流好了,那么这个输入流呢,我们写上它叫object,咱们叫input stream,刚才写上一个object in就可以了,啊等于呢啊,写完了之后,把这个呢,我们拷贝,拷贝之后呢,诶这两个咱们也注掉吧。
10:27
掉以后,我们在这个地方来想,它等于new,然后呢,把我们的这个咱们拷贝一下,拷贝以后那你想吧,你从文件中读,你是不是也得有文件啊,可以拷贝一下。宝贝之后我们拿过来,然后把这个改一下叫input,对吧,一样的啊,这个跟以前没有区别,咱们把这个改成in就可以了,那你改成in以后,那这个in呢,我们放到这边,我们写上一个,它等于new,咱们叫fair put stream,然后呢,把咱们这个文件拿过来,忘记咱们的数据就保存在这个文件当中了,所以拷贝。
11:01
报备完成以后,再把这两个管道对接上。对接上以后放过来,记住,同学们千万记住了,你现在已经对接成功了,那么里面的数据我就能取到了,但这个取不是一个字接一个字接取了是直接读对象,以我们叫object in点我们叫read object,诶你直接就可以得到一个对象了,所以我们来到它得到了以后,你看就有了嘛,对不对,这有了以后,这里呢,会发生错误,这个错误是什么呢?他说了叫class not found exception,因为啊,你读一个文件中的对象,但是它的类型你的这里可能没有,对不对,所以它可能会发生异常,这个为了简单起见呢,我就不给大家去写那么多了,我就把这个IO就去掉了。掉了以后的对象不就有了吗?老师,那个对象是什么呀?把这个O咱们打印一下,打印以后你观察一下咱们从文件中读取的到底是什么运行。运行之后咱们看结果,诶是不是我们的一个CHAPTER08的一个UR,就是我们刚才的这个U,没问题吧,说明你从这个文件中已经正确的读到了,这不就可以了吗。
我来说两句