java中的IO

本人是一个java初学者,加之头脑愚笨,过目即忘,写博客只是为了方便日后查阅,权当笔记使用。有错误的地方,还望各位前辈多多指正。

1. 概述:什么是IO?

    I:input,将持久化设备上的数据读取到内存中。

    O:output,将内存中的数据存储到持久化设备上。

2. file类

    java为了实现IO功能,用file类来描述,就是说在java中,把文件或目录(文件夹)都封装成了file对象。因此,想要用java来操纵硬盘上的文件和目录,只要找到file类就ok了。

3. file构造方法

    java中的IO

    有三种构造方法来创建file对象:

    java中的IO

运行结果:

    java中的IO

4. file的常用方法

    java中的IO

 代码演示:

   java中的IO

执行结果:

        java中的IO

常见方法2:下面方法比较简单,可以自行验证。

    java中的IO

    mkdir与mkdirs的区别:

       mkdir只会创建一级目录,mkdirs会创建多级目录。

        例:test1、test2、test3都不存在。

               执行new File("d:\\test1\\test2\\test3").mkdir();返回false,不会创建test3,因为test1、test2不存在。

               执行new File("d:\\test1\\test2\\test3").mkdirs();返回true,会创建D:\test1\test2\test3目录

5. list()和listFiles()方法。

如果已经获取了一个文件夹的对象,那么如何获取它下面的所有文件及文件夹呢?java为我们提供了两个方法:list()和listFiles()

java中的IO

 list()和listFiles()的区别:

        list():返回目录下的当前文件及文件夹的名称数组,是字符串;没有路径名。

        listFiles():返回目录下的当前文件及文件夹的对象数组,是对象;有路径名。

  看图说话:

   (1)test3文件夹下创建5个文件,5个文件夹

    java中的IO

    (2)分别执行list()和listFiles();

java中的IO

    执行结果:(因为屏幕限制,执行结果没有截全) 

   java中的IO

6. 文件过滤:FilenameFilter()和FileFilter();

6.1 FilenameFilter()

    通过listFiles()方法,我们已经获取到了一个目录下的所有文件和文件夹,但是如何才能获取到我们想要的文件呢?比如只获取指定扩展名的文件或包含某关键字的文件夹呢?答案是肯定的,java人精早都已经替我们考虑到了,那如何进行过滤呢?铛铛铛铛...,listFiles()的重载方法listFiles(FilenameFileter fileter)闪亮登场。FilenameFileter ()是什么鬼呢,且听我这个笨瓜表达一下自己的看法。

先看看API中怎么写:

  java中的IO

简单来说,FilenameFilter()就是一个过滤器接口,在接口里面有个方法accept(),在accept()方法中,来确定具体的过滤规则。所以实现文件的过滤流程是:创建一个类实现FilenameFilter()接口,重写实现类中的accept()方法,在accept方法中指定过滤规则,然后在使用listFiles(FilenameFileter fileter)方法时,将实现类对象传入就ok了。看图说话吧:

(1)自定义类实现过滤器接口,在accept()方法中写过滤规则,获取java文件

    java中的IO

(2)使用过滤器

java中的IO

执行结果:

java中的IO

过滤原理:

    File[] files = file.listFiles(new MyFileFilter());方法执行时,会将file下的每一个文件或文件夹传入过滤器,如果过滤器返回true,则将文件或文件夹存入数组,反之,不存。大家可以将文件过滤器中的返回值改为true或false进行验证。

6.2 FileFilter()

        也是一个文件过滤器接口,和FilenameFilter类似,只不过在accept()方法中只传入一个参数,一般常用的是FilenameFilter()接口,看看API中的描述

        java中的IO

6.3 FilenameFilter()和FileFilter()的区别

        FilenameFilter()过滤器中的accept()方法接收两个参数,一个是当前文件或文件夹所在的路径(dir),一个是当前文件或文件夹名称(name);FileFilter()过滤器中的accept()方法中只接收一个参数(pathname),是当前文件或文件夹的对象。

        使用场景:对于FileFilter(),因为它传入的是当前文件或文件夹的对象,可以使用一些方法,因此如果要操作当前文件或文件夹的时候就可以用FileFilter(),比如过滤出当前目录下的所有文件夹。对于FilenameFilter(),当对文件名或文件夹名字进行过滤时可以使用,比如获取以.java结尾的文件。还是看图说话吧。

    (1)使用FilenameFilter()过滤器

        java中的IO

            在accept()方法中打印dir和name

        java中的IO

            执行结果

        java中的IO

          看执行结果,dir应该就是创建的file对象,name就是file对象路径下的所有文件和文件夹名称。(完全个人理解,不一定准确)

    (2)使用FileFilter()过滤器

        java中的IO

        在accept()方法中,打印pathname,过滤出指定目录下的所有文件夹

        java中的IO

            执行结果:

            java中的IO

            看执行结果,pathname相当于是: File pathname = new File(dir, name);(完全个人理解,不一定准确)

7. 如何用递归的方式获取包括子目录下的文件

    我们现在可以使用list()和listfiles()方法,获取当前目录下的所有文件和文件夹,但是如何获取子目录下的所有文件和文件夹呢?比如一个目录很深,有很多的文件和文件夹,如何找出这个目录下的所有文件呢?对此我们可以使用递归的方法。

    递归是什么,这里不做赘述,下面写个小例子看一下吧。

        main方法中调用:

        java中的IO

        使用递归,获取指定目录下的所有文件

      java中的IO

    执行结果:

    java中的IO