00:00
好,这个又是新的一天啊,诶,那咱们接着来讲这个IO流这一章啊,这一章的话呢,我们主体的内容啊,其实就是流了啊,但是这个流的话呢,我们说用来操作具体的文件呢啊,然后针对这个文件呢,我们做数据的一个读入和写出啊,所以这块呢,我们首先呢,是讲一下这个file这类,它呢,就作为我们整个流的一个端点,这个端点呢,也就是我们把它呢,它的这个对象,哎,作为我们这个呃流的这个参数是吧,放到这个构造器当中,用于创建我们这个流的这个对象了啊。好,那关于这个file这块呢,大家主要就是掌握两点,第一个呢,就是实体化的方式,第二呢,就是常用的一些基本的方法,OK,行,这个呢,我们就不多说了啊,大家熟悉熟悉就行了,实际上呢,你会发现呢,除了我们整个面向对象之后啊,后续的咱们这个章节基本上呢,就是造对象要方法。是吧,诶我们在一开始讲第二个阶段,呃,第一开始这个第六章的时候呢,其实就提到过,说面向对象呢,我们当时有一个,呃,基本的一个思路,什么思路呢,三步啊第一步。这个叫造类是吧,或者叫创建类,设计类这样一个过程,第二步呢,就是实例化啊,造对象的这样一个过程,第三步就是通过这个对象呢,我们去调方法啊,调属性啊,那现在的话,我们再来看这个事儿的话呢,第三步这块呢,叫调方法,调属性这块呢,我们基本上很少去直接呢去调一个属性了。
01:16
诶除非呢,这个属性呢,你比如说它是一个全局常量这样的方式,那可能它就直接通过类呢来去进行调用了,啊通常情况下呢,包括我们讲了封装性以后,这个属性呢,我们都可以呢,以盖塞的方式进行一个访问和修改了。所以这块呢,我们第三步呢,主体的就是体现叫叫方法。那么第二步的话呢,就要造对象,造对象的话呢,其实就是我们调用构造器,通过new加上一个构造器的方式呢,去创建这个类的实例了,这呢也是我们创建对象的啊,最主要用的一种方式。OK啊,那这个呢是频率很高的,那从我们实际开发的角度来讲,除了new这个方式之外呢,还会出现呢,我们通过一个类呢去调它的静态方法。你比如说像咱们讲的那个日历类叫calendar calendar的话呢,我们可以呢,叫叫get instance是吧?诶这样的方法,一个静态方法,然后返回它的一个实例,后边呢,我们还会见到类似的这种场景啊,比如说我们现在要创建这个叫叉叉叉创建这个类的对象。
02:12
啊,然后呢,我们会看到呢,比如叫叉叉叉builder。Build就是构建者是吧,诶有的呢,叫叉叉叉factory。叫叉叉叉的一个工厂是吧,就是我们现在要创建叉叉叉这个类的对象,然后呢,你会发现呢,这个类的构造器呢,它给私有化了,没有对外暴露,那我们呢,发现有另外的类叫叉叉叉build,或者叫叉叉叉factory,然后通过了这两个类,它里边的静态方法,我一调用就返回了你这个叉叉叉的这种实例了。这个呢,后边我们也会见到这样的一些场景,包括呢,我们还讲过呢,像通过object里边有个方法叫做clone。克隆是吧,诶这呢也是一种方式,哎,包括呢,我们这个讲IO流,这时候呢,还有序列化,序列化呢也是创建对象的一种方式等等等,这呢还是有一些方式方法的,当然了,主要的我们还是通过这个new的方式啊。
03:04
去创建这个类的对象,那基本上咱们讲叫面向对象编程,都是通过对象来调方法,所以呢,造对象基本上呢,是非常常见的一个场景啊,然后第一个步骤呢,就是到类,或者要设计一个类,这个类的话呢,诶我们发呢,发现呢,就是API呢,给我们提供了丰富的一些类库了,咱们可以直接呢拿过来去使用,比如说你想创建多线程这块,涉及到thread这个类啊,涉及到这个集合在内存中存储数据,相关的API呢,都给我们提供好了,那我们直接拿过来用就行了,那针对于具体的业务,我们再去完成相关的一些类的创建。是吧,你看你是业务代码呢,还是具体的一些,比如扎B之类的是吧,这个时候呢,我们以前还稍微提过一下这个MVC的这种设计模式。啊,是model层的还是十图层的,还是我们这个控制器层的,相应的有一些具体的业务代码,相应这些类我们再去创建就可以了,OK啊,整个呢,都是这样一个套路,所以呢,我们这块看第三个阶段呢,整体上这个套路就是啊,基本上这个API的核心一些类呢,都给我们提供好了,我们就是从第二步开始找对象,要方法。
04:05
嗯,都是这样的套路,熟悉熟悉啊以后我们这个Java开发呢,也是这样的套路,呃,那基于这个套路的话呢,我们就讲过一个静态的哈,说过呢,呃,你可能说不需要呢去造对象呢,直接通过这个类呢,也可以去调一些静态的方法,静态的属性,当然了,这个类呢,我们从这个反射机制这个角度来看的话呢,类呢,其实也可以作为某一个类的对象啊,就是我们在反射的时候会提到一个叫做大的class。哎,这个类的一个对象。就对应着我们内存当中的某一个类了,你比如说我们这个类呢,叫做person这个类。哎,这个类的,嗯,它这个类本身咱们不是也稍微用过这样的方式啊,percent.class它其实就相当于我们这个大的class的一个实例了,所以你说这个类去调这种静态的属性方法,其实一定程度上你也可以把它看作是一个对象调方法。调属性,所以呢,我们这个,诶万事万物接对象,基于对象呢,我们去调用相关的结构,这个思路呢,诶也算是适用的啊,OK,这呢就是整个这样一个套路啊,这个清楚以后呢,我回过来,那这里边我们涉及到这个file类的使用的话,自然而然就是到对象啊,调方法啊,熟悉熟悉常用的一些方法就可以了,然后呢,接着我们来说这个流流这块呢,套路也是一样的哈,就是我们要想完成相关的这个数据的这个传输是吧,相对应的类呢,用的是哪些类啊是吧?怎么到对象啊,这个方法都有哪些啊啊就是这样一个思路啊。
05:23
那么前一天的话呢,我们讲的时候呢,是讲到这个基本的这个节点流了,这上提到有四个哈,这四个呢,因为都加上一个file了,所以我们也称为呢叫文件流。啊,显然的话呢,这个节点的这个概念呢,会更大一些,就是我们说能够直接来操作这个文件呢,啊,咱们就要节点流了,然后在现有的流基础之上。啊,包裹现有的瘤了,我们就要处理瘤了。那节电流里边呢,其中有四个呢,就是这四个。这四个里边呢,我们先讲到这两个啊,因为呢,它俩是处理叫字符的,字符呢,咱们说就比较形象了,所以呢,咱们就可以写相关的这种像T这种格式的文件,哎,咱们体现这个叫读写是吧,这样个过程,好,那关于这两个流,咱们已经讲完了,这两个流这个操作呀,其实是比较标准和规范的,也ID呢,就是我们剩下的这些流,包括呢,我们后边要讲的这样的一些流,实际上呢,整个的操作的思路啊,跟咱们这两个流啊都是一致的,也就是这个步骤呢,都是这样一个步骤。
06:21
OK啊好,那我们下边呢,接着来去讲,说这两个流呢,刚才我们提到了,说它是用来处理叫字符的,那咱们还写了一个最后。写了这样的一个程序,这个程序呢,我们是实现了一个叫hello.t这个文件的一个复制行为。确实呢,我们发现呢,诶文件呢,也复制成功了。啊,那么现在一个问题啊,那如果说我把这个文件呢,现在改了不是一个TT文件了,假设呢是一个图片。那你说我们同样的使用这个和能不能实现一个复制呢?啊,他说不能了是吧,那咱们实验一下啊,这块呢,我把整个这个代码呢,我CTRLC一下,咱们在下边呢,再CTRLV啊,我就原封不动的给它粘过来,这个呢,我改成是一个叫六,然后这块呢,我们说需求说复制一份,这个咱们换一下是吧,这呢我就找一个图片了。
07:11
啊,这个图片的话,比如我就自己来找一下我这的图片了啊。嗯,图片咱们整一个。找一个哪个呢。嗯。找一个哪儿的这个。这个是不是可以是吧。我把这个图片呢,我就拷贝到这儿了吧,这样大家也都有了就是吧。放这儿了啊。好,这呢是一个图片,诶放哪呢啊在这儿呢是吧,好,现在把这个图片呢,我CTRLC一下,然后呢,我在这个位置啊,咱们这儿呢,需要复制一份这个文件。啊,然后呢,命名为啊这个我们比如说叫呃下划线。哎,叫做copy。
08:00
诶叫做copy了啊好让我们看这个需求呢,能不能成功啊好,那这个位置的话呢,我把它呢,就切换一下啊CTRLV了,然后呢,把这个啊CTRLC。嗯,提换到这儿啊,其他的位置呢,我这块都不变,这个关闭这个方式的话呢,咱们就把这个呢,我给它就给删了啊行这块呢,来咱们走起一下啊。这块呢,你也可以写一句话啊,叫复制成功来走起。说无效的发行版本17这个呢,跟我这个呃,设置这块有关系了啊,回头来看一下,针对咱们当前这个,我这用的是1.8,这个呢,写的17,显然呢不行了是吧,这块我们得一致啊,那我这块也改成是这个17的。嗯,好,然后呢,再来。好,这呢显示呢就要复制成功了,那我们看一看这个生成这个文件啊,这块呢是这个原文件,这块呢,是我们复制以后生成这个文件,这个文件的话呢,我们去打开啊,这是没问题的啊,这个文件一打开不行。
09:00
开不了是吧,哎,所以呢,我们这个复制行为呢,注意就是失败的了。那这块我们要注意一下啊,回过来相当于什么意思呢?就是咱们当前呢,这两个流,它呢是处理字符的,它也是字符的,而我们像这种图片也好,视频也好,音频也好,他们其实就是纯粹的字节。是吧,是字节为单位传输的这个文件了,它不是我们可读性的这种字符了,所以呢,你要用这种这个字符流去处理的话呢,显然就是失败的啊,所以这块我们看这个需求的话呢,就是说。复制。那相对呢,这个是失败的啊,原因呢,我们说呢,因为。哎,这个叫字符流不适合。用来处理。哎,这个我们叫非文本文件。啊,注意啊,像这种图片的话呢,这就是叫非文本文件了,那到底什么样流适合处理这种文本文件呢?那这个非文本文件呢。得用字节流了是吧,哎,所以这块呢,我们回过来就得考虑呢,诶这两个流的一个使用了这样叫file input stream file output stream,整个的操作的思路。
10:04
啊,流程跟我们这两个呢,基本上也都是一样的,所以那么下边呢,来看一看使用file input stream和auto stream呢,我们看如何实现这个图片的一个复制操作了,好回过来我们还是呢,在这样的一个包下呢,去新建一个文件,这个呢,我们比如说就称为呢叫file,诶,Stream的一个test了啊,因为涉及到有in有out是吧,我就这样简单写了啊。好这块的话呢,我们把刚才这个需求呢,还给他拿过来。哎,是这样子的啊,CTRLC,然后呢,粘过来,哎,我们看一看,对于这样的一个图片文件,哎,我们如何使用这个input stream和auto stream呢实现。OK啊行,那么再回忆一下,我们说复制一个文件啊,或者进行这个数据传输的时候呢,它的整个的一个思路哈,首先呢,第一步。哎,我们需要呢,去创建相关的这个file类的对象。哎,File类的这个对象。
11:00
行,那这里边儿呢,就涉及到了我们一个呢,是从哪来的,这是一个文件,然后然后呢,你要复制到哪,这又是另外一个file的对象了,诶这第一步哈,第二步。哎,创建相关的流流量对象了是吧。哎,相关的啊,再我们这个题目呢,就是相关的叫字节流,OK,不是字符流了,诶第三步呢,就是数据的一个读写操作。你看读如何写出啊,OK,然后最后呢,在。为关闭必要的一些流入资源,避免的内存泄露啊好,那这块我们就开始写啊,首先第一步这是我们file一下,比如叫src的一个具体的file,诶你用一个具体的file。这呢,我们就使用这个叫相对路径呢来表示了,哎,在我们当前这个module下边,在单元测试方法当中,默认呢,就是在当前的module下边这样一个路径的,好这呢,我们刚才说的是这个啊CTRLC好把它粘过来好接着的话呢,我们再复制一份。啊,这个呢,是我们目标的这样的一个file命名为它。
12:02
Can。诶,站过来。好,这就可以了啊好,接下来的话呢,我们创建相关的这个叫字节流,首先的话呢,我们有一个流叫file input stream,它呢作为一个输入流。你一个file input stream,然后输流这块呢,对接的就是我们这个原文件。就相当于我们现在呢要使用一个流,你可以想象成呢,这呢是内存或者叫程序了,现在呢,针对这样一个文件,或者叫一个数据源,我们这块呢,怼上去一个管道,这个管道呢,就专门用了一个数据的输入的,这个呢就对应的叫file input stream。然后接下来的话呢,我们还得再指定一个,哎,就我们上面这个哈,目标的这个文件,然后呢,也上去怼上一个管道一个流,然后这个呢,是把数据呢给从内存中输出到这个文件里边,所以呢就是file output stream。诶很好理解啊,好复制一份这个呢,我们把它改成是一个out就可以了。啊行,然后它呢,对应的就是我们要写出的这个位置了,这个呢叫fos。
13:03
OK,没问题啊,像这块呢,有相关的这异常啊,暂且这异常呢,如果你要是看着别扭呢,咱们先给它一下啊。诶,我先抛出了,这呢是我们的第二步,然后第三步这个数据的一个读入和写出,咱们讲这个file reader的时候呢,其实提到过,我们每次呢,如果只读一个字节或字符太慢了是吧。所以呢,是不是一读我们说读到一个小车里边就快一些啊。咱们当时在讲这个reader的时候,来读看下边我这放了一个图是吧。嗯,这个呢,咱们就形象点啊,说呢,你要是每次呢,就读一个字节或者一个字符到你这个目的地,这个太慢了,所以这块呢,我们整一个小吃。啊,这个还嵌入了一个广告是吧,诶这个小车的话呢,这个大小实际上呢,又决定了我们每次呢,是不是最后呢,要传输的多少次啊。这个次数呢,肯定是越少越好是吧,但是这块的话呢,你这个毕竟是内存中创建一个数组,这个数组呢要越大,是不是占用的空间也会越大一些啊。
14:01
所以这块我们得找到一个平衡。啊,找到一个平衡就好了啊,OK。行,这个平衡的话呢,我们可以后边呢,考虑这个缓冲流的时候呢,到时候再说啊好,这呢就是数据的一个读入和写出,那我们这儿呢,就把这个小车呢给大家造出来,这儿呢,因为咱们处理的是字节了。所以呢,不能像我们这块,咱们创建的属于差型数组,你是字符,那这时候呢。是不就bad数组了?对的啊,我们这就是八份了啊,你一个bet好这块的话呢,我们写,比如我就写个叫1024了。就是这块你写个100也行是吧,凑个整1024啊,这不就说乘员来凑个整1024是凑整啊,这个相当于是二的十次方是吧。OK啊行,这个1024的话呢,我们就通常称为叫EKB了。哎,B就是这个BA呗。啊行,然后呢,接下来那我们这块呢,每次你读到这个小车里边读进去几个呀,咱们也得呢,去拿一个变量来记录一下啊,记录每次读入到咱们这个八份中。
15:05
字节的一个个数啊。好,这个呢,跟咱们前面写的这个逻辑呢是一样的,这个LN呢,就使用我们这个FS点我去read,把数据呢,读到咱们当前这个buff里边。然后呢,你返回一下读进去几个,如果这个个数呢,不等于负一,表示呢,你就读进去了,既然你读进去了,我就把你取出来是吧?Fos点我们去write的时候。这个时候呢,我们就调这样一个方法啊,首先呢,把我们这个八分钟的数据呢取出来,但是这个数据的话呢,你不能全取,万一呢,它里边就读进去一部分,你不能全取出来是吧,所以那取从哪取呢?从头开始取,每次呢只取LN这么长。像呢,一开始的这样的一些循环啊,基本上都是写满了,然后在呃,相当于是最后的时候啊,我们依次往这里边儿存的,可能就没存满,比如就写进去十个,那这个LN就是十这块,你就只从里边读十个就行。
16:00
好,然后呢,他再去读的时候,文件已经没有了,所以呢,这时候返回就是负一了,那负一的时候呢,我们就退出当前循环了。OK啊好,最后呢,这个叫关闭资源,这呢我们涉及到有两个输入流,输入流这两个的话呢,先关谁后关谁,其实无所谓啊。那我们这呢,叫close。诶这呢,我们就要close就可以了,好这块也有相关的这个异常,咱们说呢,为了保证它呢一定能够执行成功,所以这块我们就不能使用这个Rose的方式了,从这到这儿是吧。Ctrl out加个T。哎,然后我们选这个呗。那这样我们就1.printstas了,然后呢,把这两个呢,我们CTRL加shift点上往上移进去。哎,然后他们俩呢,分别呢,在alt加回车,然后选这个啊再回车。哎,这么着他俩呢,并列呢,我们去处理呢就可以了啊。嗯,这样就行,好,未来我们这个程序的这个健壮性咱们也提过了啊,FS不等于no。这呢同样的啊,If f is,哎不等于no,这个呢就都套路啊,CTRL再加个L加是格式行了,这个就写完了啊,然后这个位置呢,你要愿意加个输入语句呢,就加一个叫复制成功。
17:12
诶,OK,搞定啊好,这个搞定以后呢,下边呢,来咱们去做一个run啊。成功了是吧,这个成功以后的话呢,这呢,我还是叫这个play go copy,这个咱们前面讲诶read writer时候也提到过哈,所以呢,我们要使用的类似于这样的构造器的话呢,是不是对这个文件会覆盖一下。对的啊,那它是不是还有类似的这个一个呢,叫处一个叫false啊。放的时候呢。是不是跟我们刚才写这个是一样是吧?A要写成是个处呢。就成追加了对吧,OK啊行,这个细节呢,大家稍微注意一下,跟我们这个file writer呢是一样的啊,为什么要用它的话呢,就是对原有这个文件呢,是个覆盖了,所以这是我们再打开啊没问题。还还还可以是吧,大家说我得细着比一比,看这俩一样不?你也看不出来是吧,好找一下我们这个位置啊。
18:02
这呢是我们这个叫原文件,咱们看一下它的这个字节的大小啊,这是原文件呢,然后再看一下我们复制好以后的这个啊。哎,走起这个放这儿。哎,这个放这儿啊,对比一下你看啊,89831 89831啊,完全是一样的,所以我们这呢,实现的就是一个复制的一个行为啊。没问题。好,这个呢,就是我们说的这样的一个题目的一个视线。所以说这块呢,这个图片我们使用这个字节流是可以实现复制的,那除了这个图片之外呢,其他的你像这个音频呀,视频呀,这种之类的数据,是不是也可以考虑用这两个流来处理啊。啊OK啊行,那这块问一句,你说我们这个前面呢,使用这个字符流操作这个hello是吧,这呢属于一个叫文本文件啊,这个文件里边你看有这样一些数据。你说这个数据,咱们要是使用这个字节流哈,想复制一下,你说行不。
19:02
有同学说,诶,是不是可能会有乱码问题啊。会有吗?诶,你看这个事儿啊,来,咱们把这个呢,你看我CTRLC一下,我源源不动的在这儿放倒过来,这块我们写一下啊,说复制一份还是它CTRLC。这样一个文件是吧,然后把这个文件呢,我们可以再重新的命名一份啊,这个咱们叫HELLO1吧。或者这块啊,我们下划线一下。叫a copy啊,这个我们叫做二了,这个操作呢,其实很简单,你只需要呢,把这个CTRLC是不是在这替换一下。然后后边这个呢,也替换一下CTRLC。哎,这就行了,其他位置都不用动。当然这个我们这个文件呢,比较小了是吧,比较小的情况下呢,我们此时呢,这块1024其实一次呢,是不是就读完了。这也没关系,学完一次读完了,第二次呢,负一负一就负一呗。好,这个时候呢,我们看看行不行啊,会不会出现这种乱码的问题。
20:01
走起。你看成功了是吧,成功以后的话呢,我们这时候把它打开,你看诶没事。这也没事,对有同学说,哎,这里没中文是吧,有中文的话呢,说就有事儿了。嗯,有中文的话呢,一定有事吗。比如来个中国吧。好,那这块的话呢,咱们也可以把它改小一点是吧。小改小一点,我们去感受一下,比如我就写个五吧。那五个意思,五个意思是吧,五个意思的话呢,你看一看哈。嗯,五个一次,那有同学说这个123这个中呢,可能又占俩,这也算五个了,凑整了,那不行,就这样,我把这个中国呢,我放到这儿吧。你看啊,第一次是不是这五个。第二次就这五个吧。然后现在这个中和国的时候呢,你说这块怎么分呢。哎,一个中这算占几个呢?诶注意啊,咱们现在呢,是在买第二种生成的文件,这个文件的话呢,其实我们要看下它的大小,这个大家你得心里有数哈,这个我们前面提到过这个问题,这个我放到这儿,然后呢,咱们来一个叫open in啊打开。
21:10
你看从我们磁盘这个位置呢,把它打开啊,打开以后,呃,现在的话,你说看它的这个大小是几个。字节多少个?哎,这块你看十个了吧。诶,这加上这是13个了,然后呢,现在咱们其实在第二种生成那个文件啊,它默认的就是UTL8存储的,所以说一个汉字呢,应该占三个是吧,这就六个呗,所以应该是19个字节对吧。好,这块我们看一眼啊,属性那19个字节。完全没问题,好,那这时候呢,就回过来啊,意味着咱们第一次呢,五个就把这五个读了,第二次五个是不是把这五个读了。好,第三次我们要再读的时候呢,还是五个,这呢是不是就占了仨。那就意味这个国呢,是不是要劈了,劈开了是吧。诶,比如说这个中国的中呢,它这不是占三个字节,国呢也是三个字节,后边这个123可以这样理解,那相当于呢,我们此时呢这个。
22:03
再换一个颜色啊,此时呢,我们这一波这个小车把这几个给读了,然后下一波这个小车呢,把这四个读了,最后还空一个了是吧。哎,那就less的话呢,就是四呗返回的。行,那这块呢,你说我们会出现乱码吗。啊,不知道了,就保存一下,保存完以后你看回过来。这时候呢,我们把这个再跑一下呗。跑完了是吧,跑完以后呢,这是我们对应的这个叫COPY1哈来。走起。没有是吧。能理解吗?这怎么没有乱码呢?注意这块呢,它就是没有乱码,为啥呢?因为呢,我们根本也没有在内存当中试图去看一看,它只是原封不动的把它又。放回去了,放在一个新的文件里边了,新的文件在打开的时候呢,仍然把这个国呢,就合成一个整体了。哎,其实咱们说一个脑洞的一个事儿,就是这个事儿呢,你别这样去做,但你可以这样稍微想想什么意思啊,就是这个人是吧。
23:06
这个人呢,躺到这儿了哟,腿放歪了啊。啊,这个人躺在这儿,然后呢,你给他那个分了分是吧。啊,分了分,然后呢,就分开呢,给他去运输了,运输完以后呢,这块你再给他拼好机器人啊,他拼好以后呢,你把他叫醒,他就感觉跟没事没事人一样。他感觉不出来呢,之前发生了什么。是吧,但是你在这个过程当中啊,你比如说就就只有这一部分了,你别叫醒他,你一叫醒他,他就。坏了是吧,那这时候不全吗。理解这意思是吧,所以这块原封不动的,你就给他拼好了,这块呢,他就啥事没有,怎么叫中间叫醒呢,哎,就好比是呢,我们这么着处理了。你看啊,我把这个呢,咱们再原封不动,我CTRLC一下,我再复制过来,复制过来的时候呢,我这么着了,看这是三哈,呃,这个呢,我们不是复制的,我们说呢叫读取。
24:00
诶,读取hello.t这个文件,然后将数据呢显示在控制台上。是吧,这个操作啊,你看我们这时候这个输出的这个我就不需要了,我把它删掉了啊,这个就删掉了,这个就不要了啊,然后这样我也不要了,然后这呢,我们不是还有五个嘛,LN在这儿,OK,下边这块呢,我想把它呢读入到我们这个控制台上显示出来,这个咱们可以进用一下这个string吧,String的话呢,它用一个string,还有一个对应的构造器,咱们就可以把这个buffer呢翻过来,这里还写个零写L音。啊,这个呢,咱们也不是说把它呢,全部的内容都读进来啊,每次呢还是只取L个啊,然后这时候我们把它呢,显示到对应的这个控制台上,就这样个思路。这块这个流呢,也用不着关了,把这个呢也删掉啊,这个能看懂吧。好,此时的话呢,你说我们读取的话会有问题吧。对,这就出事了,你看。是不是出现这个乱码了。啊,这时候咱们说这个钟为啥没事儿呢,因为刚才咱们读的时候没有给他劈开嘛。
25:00
对,正好呢,把它是作为一个完整的部分呢,这个拿进来,然后又读出写出去是吧,显出显示到我们这个HR里边,所以他没事,但这个国不行。OK,但是整体显示的话呢,就是个乱码的一个情况。啊OK啊,所以这个事儿的话呢,我们不能做。啊,但是呢,我们要说原封不动的,先把这样的一个文件是一个文本文件了啊,我们呢,就是从这个地儿,哎,分成了好多部分,这个呢,就是我们每次呢,就是字节的一个大小了哈,然后把它那原封不动呢,再搬到另外一个地儿。中间呢,也没有试图呢去打开看一看,只是原封不动的复制了一份,这个时候呢,你再打开其实是没问题的。OK啊,所以这块呢,我们这个去操作这个文本文件的话呢,发现也是成功的啊,所以呢可以使用。来自节流啊,实现文本文件的啊,它的一个复制操作啊。好,那么这块呢,我们针对这个字节流呢,咱就说完了,回去做一个总结看一看啊,首先关于呢,File input stream outp的一个使用第一个执行步骤,这个步骤啊,我说跟咱们这个呢,是完全一样的。
26:07
整个的思路哈,看一下第一步创建读取或写出的范围类的对象,第二步创建输入流,和输入流没问题,具体的读入和写出的过程唯一有区别呢,就是操作的单位。哎,咱们改成了叫be。是吧,然后这块的话呢,他也不能这样去写了,直接呢,只有一个去write呢,是一个BA型这个数组的这样一个操作了,这个咱名呢,把这个C9去掉吧。哎,Buff buff分啊。这样呢,就是一个缓冲的一个桶一样啊这样的。行,这个呢,就是读入和写出的这样一个过程,最后呢,资源的一个关闭,那跟原来的套路还是一样的,那就是这样一个步骤。好,然后这里边呢,有什么注意点呢?诶这个注意点的话呢,其实有一些呢,跟咱们这块呢是一样的哈,就是同上的,你比如说因为呢,涉及到诶我们说的流资源这个关闭了,所以出现异常的话呢,我们需要呢,使用check开分类的方式来处理。这个是一样的,第二呢,对于这个输入来讲呢,必须要存在,否则呢就file not放到exception了,输出的话呢,这个不存在没问题,然后会自动创建是吧,如果你要是用这个的话呢,诶这个相应的就是在末尾追加内容了,就这块儿呢,跟咱们上边呢是一样。
27:13
只不过呢,你把这个呃,对应的这个类名呢,给他改一下就行了。呃,这呢,我们再说别的问题啊,所以我这块我这样说说呢,在。咱们这个3.2注意点的基础之上啊,咱们去说啊。哎,这个我就不重复的这样去写了啊,基础之上。哎,然后呢,看其他的这个,哎,注意点。其他有什么注意点呢?哎,这时候呢,我们其实要说说咱们刚才呢,写的这个叫字节流跟上面的这个字符流它们之间的一个区别了,那我们发现哈,这个字符流。他呢,俩只能够用来处理文本文件。啊,因为咱不是针对这个file writer,咱们试图呢复制个图片,你发现这个事儿呢不靠谱。
28:00
啊哎,所以回过来啊,在这写一下啊说呢。对于。哎,字符柳怎么说呢,只能。用来,诶操作呢,叫文本文件。诶,尤其呢,是不能用来处理非文本文件的。啊,你想想也是哈,你比如说咱们这个图片的话呢,底层呢,就是01010,它没有实际的具体的含义,可能你还原回来呢,就是一个颜色的一个点啊,是一个红色的呀,是一个黑色的呀,是吧,这两点你非得给它还原成个字符,字符是个差。那那傻叉呀,是吧,完全没有概念,没有意义啊,所以呢,不能够用来处理这个非文本文件。OK,那么相对应的哈,然后我们说呢,对于叫字节流。哎,他那怎么写。啊,这个我们这样说吧,说通常是用来处理叫非文本文件的是吧。
29:02
诶,通常呢,是用来处理这个非文文件的,这个所谓的处理呢,就是我们说的传输的意思,你可以读进来,也可以写出去啊哎说呢这个接着哈,说但是呢,说如果涉及到啊文本文件的一个复制操作。哎,我们说呢,也可以使用咱们的字节流是吧。诶字节流注意你看这会我说的是涉及到文本文件的一个复制操作,没有说呢,你只是把它读进来哈,如果广日读进来的话呢,就像我们刚才这块写的试图呢,在内存中,你想看一看这个事儿的话呢,我们说呢,是可能出现乱码的是吧。OK啊,注意这块可能出现乱码的话呢,其实咱们只是针对有中文的情况,如果说呢,这个文件哈,它纯粹的全是这个abcd的,包括123的,包括一些半角的这种半角情况下,这种标点符号的话呢,会出现乱码吗?
30:01
不会,为什么呀。对,因为呢,你像这个abcd啊,这个123呀,包括常见的一些标点符号,它呢底层呢,是不是就其实完全的类似于就像用二次码就存了是吧,当然了,咱们用的其实还是U田法啊。还是U,只不过U8呢,在你这些呃,都是英文字符,包括123的时候呢,它其实就都用的这个兼容的X码了,说白了就是他们都用一个字节来存的了,既然是一个字节存了,那我这块呢,读的时候也是以字节为单位了,是不是肯定不会出现把这个英文字母给匹匹一半了,是吧,所以他就不会出现乱码,只要你用汉字的话呢,这个事儿就有问题了,因为汉字的话呢,它会出现多个字节来表示这一个。字符了,诶所以这个时候呢,你把它劈开了,你再读出来,那就出现乱码了。诶,把握一下这个本质就可以了啊好,那么这里边儿我们提到叫文本文件和非文本文件,那我们就得说明一下。啊,那么据大家的了解,什么叫文本文件,什么叫非文本文件呢?常见的,你看一些后缀都是什么呀?
31:02
对,典型的这个呢,文本文件就是点T了是吧。那你说咱们这个写的。啊,就是说这个点doc是吧,这算文本文件还是文文件。啊对,有同学呢,凡是用过这个word都知道里边能插入图片是吧。嗯。那要没插入图片算文本文件吗?其实也不算。也不算啊,就是你这个word呢,它其实一个自处理的一个软件了,这个软件呢,其实你比如说咱们像什么叫文文件了,比如这块我只要不主动去换行,它会一直往后写,你发现那word的话呢,是不是写到一定程度它就换行了,包括这个字体呢,你可以大可以小,可以换颜色,可有背景。是吧,像这些呢,其实都是已经对文本文件的做了处理了,所以他呢,即使你不包括这些图片啊等等一些内容信息,也要归到这个非文本文件这块啊,还要回到这儿了,还有我们处理的比如说Excel啥的是吧。诶是这个格式吧,是吧,诶类似的这种呢,它其实都属于非文本文件啊,文本文件呢,还有比如咱们写的这个Java程序。
32:06
是吧,这个呢,他算的就有文本文件了啊,就是我们这块呢,比如说这个,我想把这个文件呢,给它复制一份,你可以使用我们的字符流是没问题的啊。好,然后呢,还有比如说我们写的这种C的程序啊,或者这个C加加的这种程序啊。是吧,包括这个Python的这种程序啊等啊这些话呢,都可以归结为呢,叫文本文件啊。啊没问题,那非文本文件呢,这呢两个算了,还有呢,比较典型的,比如说这个对TPT是吧。对,点PDF。嗯,点这个MP3。嗯,MP4。嗯,点那个。呃,点AV这个I是吧。再加个I哈,嗯,还有呢,这个音频视频图片等吧。是吧,哎,这样的一些啊。这些呢,都属于这个非文件也外呢,就是这些格式的文件啊,你不管你是复制也好,还是基本的传输也好,都不能使用字符流,字节流啊是正统的处理方式,那对于这些的话呢,如果你仅是复制的话呢,可以用字节流,当然呢,诶建议呢,你使用字符流。
33:13
啊,因为字符的话呢,为单位更合适一点。OK啊好,这个呢,就是我们说的这个file input stream啊,File output stream啊,那么刚才我们在这个进行数据的传输的时候呢,都是使用的是一个数组了啊,那这种数组的话呢,一般呢,面积成多大呢?这个呢,咱们现在呢,呃,测试的话呢,就是你写一个长度就行,针对于呢这个细节咱们想看,所以放的比较小。啊,像我们上边这块的文件比较大的时候呢,比如考虑1KB啊,或者说几KB都可以啊,这呢我们用的叫1024啊。这1024的话呢,是不是说正好呢,你看是。十二十四那正好呢,就把这个十月24呢,就给它单拿出来了,哎做一段叫程序员结是吧。啊,成员结,知道成员结吧。啊,就是幺零二四十月24号这一天,这一天的话呢,化成什么呀,就是不加班了就啊。
34:05
哈哈。对,然后呢,我在这个咱们这个课件里边呢,是不是还。对,这个还会有一些福利的是吧。当然这个福利的话呢,也得看互联网公司的一个效益是吧,前些年的话呢,这个效益都比较好,所以呢,你看programmer day这块呢,搞的活动呢,就比较丰富一些是吧。嗯,这个呢,比如有一些岗位呢,叫程序员鼓励师啥的,还有是吧。嗯。防脱发是吧?嗯,成员节啊,记加班是吧。这样的情况啊,对各个公司呢不一样啊,互联网公司呢,因为程序比较多嘛,所以呢,搞的活动呢,就比较热闹一些啊。OK。行,知道有这么个节日啊,就是大家的一个节日了是吧。然后这个的话呢,是我一个朋友啊,然后呢,他在成员节的时候公司发的东西,他呢,就是原来在滴滴的时候,滴滴呢,那时候呢还没上市呢,然后阿里啊腾讯啊是吧,包括其他一些资本啊都给他投资,所以呢,属于一个宠儿的时候哈,比较有钱。
35:05
发了这些东西,还有一个。发了一个苹果本是吧。这不写了吗,是吧?公司发的苹果本。啊OK行啊,现在的话呢,这个很多公司呢,都已经开始要节衣缩食了,所以成员节的时候呢,可能就比较低调一些了,是吧。啊。好,那么我们回头呢,在这个传输数据的时候呢,我们此时呢,就可以使用,比如说1KB2KB3KB4KB啊这样的一个大小啊去处理OK。
我来说两句