00:00
大家好,我是海波老师,Java数据流操作的相关概念,咱们之前讲的已经差不多了,那么这里的IO呢,就是input啊output,还有呢,重点就在于这个stream上,这个stream呢,我们是流转的意思,这个不要理解错了啊,那么咱们接下来就准备讲一讲具体的数据流操作,那么首先呢,咱们讲一下数据流操作当中的文件流操作,那么咱们这里呢,复制一下代码拷贝。然后呢,把这个零幺啊,咱们改成零二,然后呢,后面呢,写个下划线,咱们加上一个file,这个就是文件的意思啊,咱们点击OK,点击完成以后,把这些东西咱们都去掉,那么这里呢,我就写上它,咱们叫IO。啊,然后后面写上文件流啊。好了,那么之前啊,咱们给大家讲过了,就是基本的数据流操作呀,其实呢,它就是确定我们的数据源,以及呢,我们的数据的目的地对不对,然后呢,把中间的管道设计一下,把它对接咱们的数据源和我们的目的地,那么最后呢,打开这个阀门,让数据流转起来就可以了,这就是基本的数据流操作,那么接下来咱们要讲的文件流啊,其实跟这个本质上是没有区别的,什么意思呢?就意味着我现在把这个复制一下。
01:08
好了,那我复制以后呢,我们往下啊,咱们往下其实啊,所谓的文件流呢,就是把我们的这个数据源和这个数据目的地啊,咱们换成我们的系统文件,所以呢,把这个往下放,往下放以后把这个图标啊,咱们放过来,我这里改成一个文件,咱们叫file,那么这里呢,把它放过来就可以了,我们这个放大一些啊,然后呢,把这个颜色呢,变成我们的白色,诶可以了,那么我这份文件呢,就变成了我们的数据源,对不对,那这个我们的A呢,就是文件中的内容了,那咱们复制一下咱们数据源呢,可以是文件,咱们这个目的地呢,也可以是文件,对吧?诶,这就是文件流的本质啊,这个图啊,我相信呢,大家并不难理解,对不对,但是咱们之前讲过,Java为了解决跨平台的代码一致性问题,所以呢,它创建了Java虚拟机来隔离不同的操作系统平台,对不对?好处肯定是有了嘛,它可以跨平台嘛,但是带来的问题就是我们Java的代码其实是无法直接访问系统中的内容的,包括内存呢,磁盘等等,对不对?那么同样磁盘中存储的文件数据,它其实。
02:09
也是无法直接访问刀的,那么咱们这里图啊就要稍微的改一改了,所以呢,把这个地方咱们放过来,放过来以后大家看一下,我现在呢,就得把这么操作一下,来把这个呢放到虚线,放到底层去给它一个背景啊放过来放这边好了,那么这个时候呢,我写完之后大家看一下,我把这个文件呢,我放到这边啊,然后呢,把这个呢,给它一个透明,哎透明,透明以后大家可以看到我们这个线呢,是没有包含文件的,对吧?那咱们这里呢,其实也是这样的,来把这个呢操作一下,把这个呢往这边放。好了,往这边放以后大家可以看到我现在的这个地方就都把,诶,对了,我们这边也给它变成透明一些啊,好了,那么这个时候你会发现我们在当前的处理当中,这个灰色的方块就是我们写Java程序的地方,所以我们拷贝啊,反过来我们写上Java代码。可以了。那么我们,诶把这个呢,拉大一些啊。
03:03
那么我们Java既然无法直接访问文件中的数据,那么我们这里如何将我们文件作为数据源和目的地呢?其实啊,就要使用特殊类型的对象呢,来关联引用磁盘中的文件,我们得在Java这边想个办法来引用它,那比方说我这边准备一个对象,对吧?那么这个对象呢,我们换个颜色,比方说换成个紫色,那么我们就需要有一个关联在里面了,所以我们这里加一个箭头,这个箭头呢,我们就需要哎,去关联上了,懂我的意思吗?同学们,诶,就是这个东西啊。好,那这个地方也是一样的呀,我们复制复制以后,我们到这边,我们也会有一个Java这边的一个对象来引用咱们的系统文件啊,因为我们直接去访问不到嘛,所以我们放到这里啊,好了,那这个图画完了以后呢,我们接下来就准备给大家去写一写了啊来,咱们打开我们的文件,那么这边呢,我们就写上它,我们的Java当中,如果想要访问我们系统文件,它就会有一个类型,这个类型呢,我们写上它,咱们叫做file。啊,这个file呢,就是我们的文件类型对吧?文件类型它属于什么呢?它属于我们java.io的包,所以呢,我们在使用的过程当中呢,我们是需要把它导入到我们当前的什么程序当中来的,这个咱们需要注意啊,好了,那么这里呢,我们就准备给大家创建一个文件的对象了,还写上它咱们要创建文件对象,那么这里呢,我们就写上一个叫file,那么这个file大家可以看到它的包就是java.io我们点上它会自动的给它import一下,然后呢,我这里写上一个它等于new咱们的file,然后写个括号就可以了。
04:32
那么写完以后,大家有没有注意到咱们这个后面的小括号里面有个红色的波浪线,对吧?那么这个波浪线什么意思呢?说明我们当前的程序还不对,那这个是为什么呢?来给大家解释一下,这里的file对象啊,它只是Java中的一个对象而已,这就好比咱们图形当中这个指示的小圆圈一样,我在我的Java中创建了一个特殊类型的对象,但这个对象你还没跟他说关联到哪个文件吧,你没说呀,你没把它对应到我们的某一个文件,那所以呢,它就报错了。
05:03
那怎么办?很简单,你把那个文件给它对应上不就行了吗?那么怎么对应呢?这里咱们说一下,创建文件对象,它要关联,它要使用我们的文件路径,它关联咱们的系统文件,诶应该是这样的,所以呢,文件路径呢,就是在我们小括号里面来传一下就可以了,这个咱们就称之为叫文件路径,那我就写上咱们叫做fire pass,好,我们写上一个字符串,控制符串,然后呢,把这个呢,我们传进去,你这么写就可以了,这个文件路径就指向了你关联的那个系统文件。哎呀,那我们没有怎么办?没关系,咱们这里呢,给大家创建一个啊,咱们在左边,我们点击右键,然后点击new,创建一个我们的directory,然后呢,我写上一个date,我们的数据嘛,然后呢,给它放进去,放进去以后呢,我们这里写上一个new,我创建一个文件,咱们叫做word。好点,TXT。写完以后呢,我们这里面啊,我们就写上一个hello就可以了啊,简单一点嘛,对不对,好简单一点之后把它关掉,关掉之后呢,我现在就要把这个文件的路径给我去写上,那这个文件路径我们该怎么取呢?我们这里点击右键,它里面会有一个叫做copy啊,拷贝pass啊这个东西,点点以后呢,我们就选择我们的第一个拷贝它的绝对路径,所以点一下,点完之后呢,我们放到这里就可以了,它会自动的把我们的路径呢给它写上去,这是没有问题的,那这样的话就等同于把咱们的文件已经关联上了,好了,那你关联上以后,那咱们现在把它打印一下吧,所以我们这里呢,直接打印一下咱们的file对象。
06:33
好了,比较简单对不对,哎,咱们这里来给它运行一下。运行以后大家可以看到他就把这个文件的路径啊,给我打印出来了,也没有别的,诶老师呀,那么你这个文件已经关联上了,那么你现在能对这个文件做什么样的操作呢?其实呀,你都关联上这个文件了,那么你的操作呢,就跟我们这个文件操作本质上是没有区别的,那么到底有什么操作呢?咱们就一点点来看看谁来写上我们叫文件对象的操作。
07:02
那么这个文件对应的操作呢,咱们就写上file,咱们写上一个我们的点,咱们叫is,诶大家有没有发现我们这个方法挺多的呀,其中就第一个叫it file,诶这个方法呢,我们直接去点击一下,然后呢,我们直接给它打印一下,打印以后这是什么意思呢?咱们来看看咱们运行。运行以后咱们来看结果你会发现,诶,他写了个true哦,不明白什么意思,其实啊相信啊,根据这个名称应该也不难判断嘛,对不对,它就是判断你当前的文件对象是否是文件,所以啊,我们这里写上它。咱们要做什么呢?判断当前的文件对象,它是否为文件。好了,诶不对呀,老师,这个我们的文件对象,它不就是文件吗?它不就是关联到文件,它不就应该是个文件吗?那为什么咱们还要判断它呢?哎,这个时候咱们要解释一下这个我们fail的单词呀,在英文当中它表示文件是没问题的,但是其实它除了表示文件以外,它还可以表示文件夹,就是文件目录啊,也就意味着咱们这里说一下咱们这个file呢,其实文件类型啊,它其实有两个,一个是文件。
08:12
啊,还有一个呢,就是文件夹。就这意思,所以啊,那你想想吧,那么我们这个路径没有说它一定是一个我们的什么我们的文件吧,他有没有可能是一个我们所谓的什么文件目录呢?你把这个去掉。你去掉以后,这个路径不就指向了他吗?那他不是文件吧,它是一个文件夹对不对,那所以呢,我们这里呢,再来运行,运行以后看结果。你就会发现它这个地方在怎么了,是不是false呀,为什么是false,因为它不是文件嘛,诶所以这个方法就比较特殊了,它来判断这个文件对象所关联的是一个文件夹还是一个文件,廖老师,那这个地方有没有别的判断呢?其实也是有的,大家看一下,我们除了这个fair以外,还有一个叫is,我们叫directory,诶那么这里呢,我们就复制一下来,咱们拷贝,拷贝以后呢放过来,它就是用来判断当前文件对象是否为文件夹的意思。
09:10
好了,我们再来运行,运行以后看结果,你会发现上面的应该是false,但下面的是不是就应该是true了,诶这个大家就明白了,对不对,哎,所以啊,这个比较特殊啊,就是因为这个单词的含义别误会了啊,诶老师,那照你这么说的话,既然这个路径它可以是文件路径,它也可以是文件夹路径,那我可不可以随便写啊,比方说我写一个我们的这个叫做嗯,New啊,咱们的fair。我这么写行不行?对不对,那这时候大家可能心里会慌啊,为什么呢?因为这没有啊,你没有的情况下,那你路径不存在,那么你执行以后会不会发生问题呢?对不对,你发生问题怎么解决呀?诶是咱们可能啊不太确定了,对不对,那怎么办?咱们执行一下,执行以后呢,咱们看看结果啊运行运行以后大家看一看,你就会发现他们两个都是false。为什么两个都是false呀,因为这个我们关联的路径,它又不是个文件,它又不是一个文件夹,对不对,那所以呢,它当然就会什么呢,全都是false了,哎哟,那你这个东西就有问题了,因为你这个根本就不存在啊,那如果不存在的话,我们能不能判断一下呢?对不对,那你不存在我们就无法做处理了吗?所以呢,我们这里接着写干嘛呢?就是来写上它嘟do,就是判断我们文件对象它是否存在关联,诶有一个方法咱们来拷贝一下,拷贝以后我们拿过来。
10:26
拿过来以后把这个去掉,它有一个叫exist,就这个方法,这个方法就是用来判断文件对象是否存在关联的,诶如果关联了,那就说明它是true,如果没关联上不存在,那就是个false,所以我们这里运行一下。好了,大家可以看到我们这里是不是false呀,诶好,我再改一改,把它改回去啊,咱们叫做word,咱们叫text,你现在的这个不就关联上了吗?你关联上以后,那么它说明应该是没问题对不对,所以呢,我们运行一下看结果。运行以后大家会发现它的结果是不是为处了,诶它也是个文件没问题吧,这个处就没问题了啊,所以啊同学们,我们几个方法呢,咱们需要注意一下,那所以呢,我们代码一般我们还真就不会独立这么去写,为什么呢?因为这个判断太简单了,对不对,所以我们一般怎么写呢?我先把它注掉啊,咱们先注掉,我注掉以后咱们这样。
11:17
我写上一个if,然后呢,我写上一个什么呢?我们的file啊file,然后点一下咱们叫exist啥意思,我为什么加个判断呢?就是当你的文件它存在关联的时候,你怎么做,所以咱们简单的就写上叫做文件啊对象存在的情况啊,存在啊的情况,哎就这样的,那反过来else就说明文件对象不存在啊,那说明你没关联上啊,哎,所以我们写上文件对象它不存在的情况。好了,那么一个存在,一个不存在的话,那么我们存在怎么做,我们不存在怎么做,对不对,那这里咱们还需要再去操作一下,那么首先我们先来看一看,我就假设啊,我这边干嘛呢?我写上一个叫做new file。
12:00
我要这么写的话,大家想想是不是就不存在啊,那么你不存在的话,就肯定会走这个逻辑吧,那么所以呢,我们就写上打印啊,咱们想想它,咱们叫做文件啊对象它不存在。哎,没有什么,没有关联成功,没有关联成功,好就这么写,那写完了以后,那么我们再往上放,往上放以后,如果它存在,就说明文件对象是存在的。那么你存在了以后,同学们有个问题,你到底是一个文件夹呢,还是一个文件呢,对不对?所以呢,我们写上一个if括号,括号以后呢,我就把这个东西拿过来,咱们写上它,咱们叫做点,叫it fair。啥意思,我判断一下你当前的文件对象是个文件还是个文件夹,所以我们拷贝,拷贝以后放过来,我们想它叫文件啊。咱们叫做文件对象。它关联啊,关联的是一个文件,哎,就是这样的,好了,我们接下来写上一个else啊,写上一个我们的if括号。
13:01
然后呢,我们这边写上它啊来我们叫做file,点我们is directory看一看它是不是我们的文件夹嘛,所以拷贝一下。拷贝以后,文件对象关联的是一个文件夹好了,那么我们现在就可以了,可以了之后呢,我接下来就来运行一下,那么我们现在看看打印的结果。打印的结果呢,他就说了文件对象不存在,没有关联成功,对不对,诶那这样的话我们是不是就可以了呢?还不行,因为你都知道它不存在了,对不对,那万一以后我们要用它的话怎么办?对吧,你现在没有,那万一我们以后要用呢,我们是不是可以去创建一下,所以呢,我们现在不存在,我们把它创建一下,这个是什么意思呢?在这个data这个文件目录下,我在创建一个new file的一个目录,所以呢,我们可以这样。来,我们写上它干嘛呢?我们来写上,咱们叫做嗯,File点,咱们叫什么呢?叫做make DS。这个是什么含义呢?这个就意味着把咱们当前的目录给我创建出来,这个MK呢,就是make的意思,这个DR呢就是directory,就是创建目录的意思,这个S呢,就是有多级的话可以都创建啊方说我们好几级呀,对吧,比方说我们再来,咱们叫什么呢?咱们叫做new file1对吧,你这么写,你写完以后,我现在呢,就把它给它写上它啊好了,我们运行一下。
14:21
运行以后看结果。诶,你会发现我们当前的new file就出来了,我们这边我们的new file1是不是也出来了,诶,它就是用来创建文件目录的。所以创建多级啊,多级我们的文件目录就可以了,因为你不存在嘛,你不存在我就创建好,哎老师,那万一我创建的不是文件目录,我想创建一个新的文件怎么办?比方说我们把这个去掉,把这个地方呢,我们去掉啊,咱们去掉来,咱们写上它,咱们叫做什么呢?咱们叫,诶咱们就叫new file.text吧。我这么写,这么写什么意思,我要在这个文件夹里面创建一个文件,而不是一个文件目录了,所以把这个去掉,去掉以后同学们注意,这个地方咱们就不能用这个方法了,为什么?因为这个方法呢,专门是用来创建文件目录的,而我要的是什么?我要的是把那个文件创建出来,对不对?所以呢,我们写上它叫file,点它有一个方法叫create new file,所以这个是用来创建文件的,所以拷贝。
15:23
把这个地方我们写上啊,咱们写上它,咱们要创建新文件。诶,创建一个新文件,把这个去掉好了,那么现在呢,我们运行一下看结果,运行运行以后看结果,你会发现我们在当前它就会把这个文件创建出来,但是呢,里面没有任何的内容,对不对,这个就是我们后面要做的了,现在先不管它,你就记住了,我们有不同的方法,可以创建目录,可以创建文件就行了,哎呀,老师,那如果这个我们的文件存在的情况下,你能干什么呢?对吧,你不存在,我能把它创建出来,你甭管是目录啊,还是我们的文件夹,我们都能什么创建出来,对不对,如果你是文件或者是文件夹的话,我们能做什么操作呢?所以啊,咱们把这个呢,给它稍微变一变,咱们改成叫word。
16:06
咱们这个地方不就有个word吗?那么好了,我们现在看一看,你现在呢,假设你是一个文件,那么你是文件的话,咱们能得到什么东西呢?所以咱们放咱们点,点了以后,大家会发现我们这里其实包含了很多东西,比方说我们get这个里面,我们就可以获取文件的名称,诶所以咱们来这个呢,就是我们文件的名称啊,咱们再来,来了以后咱们再来一个,大家看一下我们在这个地方有一个叫LS,这个是文件的大小。啊,你这个文件里面存的数据的大小是多少啊,诶,就有个length了,还有呢,咱们再来啊,比较常见的还有个东西叫last modified什么意思,就是你的最后修改时间,这些呢,我们其实都可以得到,还有呢,我们再写,咱们再写几个吧,嗯,比方说来有一个叫做get,有一个我们当前的什么呢?我们这个叫路径,就是你当前这个文件的一个绝对路径,它就给你列出来了啊,名称长度,我们最后修改时间以及呢,我们的路径它都是有的。
17:03
来吧,咱们试一试啊,我们刚才呢,我们这个地方呢,是我们的hello,对吧,那现在呢,我执行一下。执行以后呢,我们来看结果,诶你看到没有,我们当前的里面不就都有了吗?对不对,诶这就是我们当前的一个操作啊,就是这样的,好了,那这个有了以后,同学们,那么我们如果不是一个文件,而是一个文件夹怎么办?所以啊,咱们把这个再改一改,把这个去掉。把这个去掉以后,它就不是一个文件了,它就应该是一个文件目录文件夹了吧,所以它走的逻辑分支是不是应该走这儿了,哎,所以叫is directory就应该走这了,那走这儿的话,那有什么东西呢?所以呢,我们写上一个file点,我们叫get name,其实文件夹也有名称嘛,所以这个肯定是没问题的,那同样道理,我们的文件夹不也有这个东西嘛,对不对,你长度可能没有,但是你的什么最后修改时间呢,什么绝对路径不也应该都有吗?所以拷贝。拷贝过来以后,咱们再来看一看咱们运行。
18:00
运行啊,咱们看一看,诶,你会发现是不是也没有任何的问题啊,对不对,同学们,所以啊这个是对的,但是给大家讲啊,除了我们这几个比较常见的以外,还有一个东西就是我想看一看这个文件夹下面有哪些文件,对不对?诶咱们可以这样,咱们的那个file对象啊,它里面有个叫list,这个list呢,会返回一个字符串的数组,来咱们操作一下。这个字符串的数组是什么意思呢?它就是当前目录下的每一个文件的名称,诶这里面就存着了,那这样的话,咱们给它打印一下吧,咱们写上一个我们的for循环啊,写个for循环,然后呢,我们这里我们把这个量去掉啊,我们用这个idea呢,咱们自动生成一下,它有一个for,咱们回车,回车以后我们直接打印咱们的S就可以了,这个S呢,就是它的一个名称了,所以我们这里拷贝。拷贝以后呢,我们现在呢,给它来写上啊,咱们写上文件夹中的啊,我们的文件好了,现在呢,我们运行一下。运行以后大家看到文件夹中的文件是不是一个叫new file,这是一个文件目录吧,这是一个word.txt没问题吧?诶,那你现在是把我们的这个名称拿到了,那我想看一看这个文件夹下面有什么怎么办?诶这个时候你光拿名称就不够了,你得把这个文件夹的对象要拿到,所以我们这里还有一个咱们叫file点啊,咱们叫做file点,有一个叫list files,这个方法呢,会返回的是它的每一个文件对象。
19:28
所以啊,这个呢,我们拿到你拿到以后,你把这个复制一下,诶复制复制以后你把这个写上它拷贝,拷贝以后呢,我放过来叫做文件对象好了,那么我写完以后,你把这个呢,我们再来运行一下,咱们看看效果啊,这个呢,我们复制放过来,然后把它改一下,咱们叫做file,嗯,可以了,可以了,之后咱们运行一下。运行以后,大家会发现我们当前是不是就得到了那个文件对象了,对不对,好了,那你文件对象有了以后,那剩下的跟前面不就讲的是一样的了吗?对不对,那当然了,除了我们这些方法以外,我们的文件对象还会有很多别的方法,那咱们后面再给大家详细的去讲好吧。
我来说两句