本人是一个java初学者,加之头脑愚笨,过目即忘,写博客只是为了方便日后查阅,权当笔记使用。有错误的地方,还望各位前辈多多指正。
1. 概述:什么是IO?
I:input,将持久化设备上的数据读取到内存中。
O:output,将内存中的数据存储到持久化设备上。
2. file类
java为了实现IO功能,用file类来描述,就是说在java中,把文件或目录(文件夹)都封装成了file对象。因此,想要用java来操纵硬盘上的文件和目录,只要找到file类就ok了。
3. file构造方法
有三种构造方法来创建file对象:
运行结果:
4. file的常用方法
代码演示:
执行结果:
常见方法2:下面方法比较简单,可以自行验证。
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()
list()和listFiles()的区别:
list():返回目录下的当前文件及文件夹的名称数组,是字符串;没有路径名。
listFiles():返回目录下的当前文件及文件夹的对象数组,是对象;有路径名。
看图说话:
(1)test3文件夹下创建5个文件,5个文件夹
(2)分别执行list()和listFiles();
执行结果:(因为屏幕限制,执行结果没有截全)
6. 文件过滤:FilenameFilter()和FileFilter();
6.1 FilenameFilter()
通过listFiles()方法,我们已经获取到了一个目录下的所有文件和文件夹,但是如何才能获取到我们想要的文件呢?比如只获取指定扩展名的文件或包含某关键字的文件夹呢?答案是肯定的,java人精早都已经替我们考虑到了,那如何进行过滤呢?铛铛铛铛...,listFiles()的重载方法listFiles(FilenameFileter fileter)闪亮登场。FilenameFileter ()是什么鬼呢,且听我这个笨瓜表达一下自己的看法。
先看看API中怎么写:
简单来说,FilenameFilter()就是一个过滤器接口,在接口里面有个方法accept(),在accept()方法中,来确定具体的过滤规则。所以实现文件的过滤流程是:创建一个类实现FilenameFilter()接口,重写实现类中的accept()方法,在accept方法中指定过滤规则,然后在使用listFiles(FilenameFileter fileter)方法时,将实现类对象传入就ok了。看图说话吧:
(1)自定义类实现过滤器接口,在accept()方法中写过滤规则,获取java文件
(2)使用过滤器
执行结果:
过滤原理:
File[] files = file.listFiles(new MyFileFilter());方法执行时,会将file下的每一个文件或文件夹传入过滤器,如果过滤器返回true,则将文件或文件夹存入数组,反之,不存。大家可以将文件过滤器中的返回值改为true或false进行验证。
6.2 FileFilter()
也是一个文件过滤器接口,和FilenameFilter类似,只不过在accept()方法中只传入一个参数,一般常用的是FilenameFilter()接口,看看API中的描述
6.3 FilenameFilter()和FileFilter()的区别
FilenameFilter()过滤器中的accept()方法接收两个参数,一个是当前文件或文件夹所在的路径(dir),一个是当前文件或文件夹名称(name);FileFilter()过滤器中的accept()方法中只接收一个参数(pathname),是当前文件或文件夹的对象。
使用场景:对于FileFilter(),因为它传入的是当前文件或文件夹的对象,可以使用一些方法,因此如果要操作当前文件或文件夹的时候就可以用FileFilter(),比如过滤出当前目录下的所有文件夹。对于FilenameFilter(),当对文件名或文件夹名字进行过滤时可以使用,比如获取以.java结尾的文件。还是看图说话吧。
(1)使用FilenameFilter()过滤器
在accept()方法中打印dir和name
执行结果
看执行结果,dir应该就是创建的file对象,name就是file对象路径下的所有文件和文件夹名称。(完全个人理解,不一定准确)
(2)使用FileFilter()过滤器
在accept()方法中,打印pathname,过滤出指定目录下的所有文件夹
执行结果:
看执行结果,pathname相当于是: File pathname = new File(dir, name);(完全个人理解,不一定准确)
7. 如何用递归的方式获取包括子目录下的文件
我们现在可以使用list()和listfiles()方法,获取当前目录下的所有文件和文件夹,但是如何获取子目录下的所有文件和文件夹呢?比如一个目录很深,有很多的文件和文件夹,如何找出这个目录下的所有文件呢?对此我们可以使用递归的方法。
递归是什么,这里不做赘述,下面写个小例子看一下吧。
main方法中调用:
使用递归,获取指定目录下的所有文件
执行结果: