File类
一、简介
- java.io.File
- 提供文件/文件夹的 创建、读取、写入、修改、删除等操作。
二、File类的构造方法
public File(String pathname) //字符串类型的文件或文件夹全路径
public File(String parent, String child) //父路径字符串、子路径字符串
public File(File parent, String child) //父路径对象和子路径字符串
// public File(URI uri) //通过给定URI转化抽象路径来创建一个File实例
- 举例:
File f1 = new File(“D:\code_test\demo1\hello.txt”);
File f2 = new File(“D:\code_test”, “\demo1\hello.txt”);
File dir = new File(“D:\code_test”);
File f3 = new File(dir, “\demo1\hello.txt”);
f1,f2,f3的输出结果都为: D:\code_test\demo1\hello.txt
三、File对象创建、删除、判断
- 方法
创建文件:createNewFile()
创建目录:mkdir() / mkdirs()
删除:delete()
判断存在:exists()
判断类型:isFile()
isDirectory()
- createNewFile() 创建文件对象,返回Boolean类型
File file = new File("hello.txt");
boolean b = file.createNewFile(); //当前路径下创建hello.txt文件 b=true
- mkdir() 创建单个目录
mkdirs() 创建多级目录
File dir = new File("D:\\code_test");
boolean b1 = dir.mkdir();
File dirs = new File("D:\\code_test\\demo1");
boolean b2 = dirs.mkdirs();
当然创建单个目录时也可以使用mkdirs()
- delete() 删除文件或目录
boolean b3 = file.delete();
- exists() 判断文件(夹)是否存在
boolean b4 = file.exists();
- isFile() 判断是否是文件
isDirectory() 判断是否是文件夹
File f = new File("D:\\code_test\\hehe"); //使用无后缀文件进行测试
System.out.println(f.isFile()); // true
System.out.println(f.isDirectory()); // false
四、listFiles()
- 使用
listFiles()
可以获取指定目录下的所有文件(夹)对象,该方法返回的是一个数组或集合。 list()
方法用来获取文件(夹)名称,listFiles()
方法获取文件(夹)对象。
所以,listFiles()
更为常用。
代码演示:
public class FileMethodDemo {
public static void main(String[] args) {
File dir = new File("D:\\code_test");
//获取目录下的文件以及文件夹的名称
String[] names = dir.list();
for(String name : names){
System.out.println(name);
}
//获取目录下文件以及文件对象
File[] files = dir.listFiles();
for(File file : files){
System.out.println(file);
}
}
}
- 在获取指定目录下的文件或者文件夹时必须满足下面两个条件:
- 指定的目录必须是存在的,
- 指定的必须是目录。否则容易引发返回数组为
null
,出现NullPointerException
五、文件过滤器
- 筛选指定类型或指定格式的文件
- FilenameFilter过滤器
当需要对文件名称过滤时可以使用FilenameFilter
过滤器,FilenameFilter
过滤器中的accept()
方法接受两个参数,一个是当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称。
// 过滤出后缀名是 .java 的所有文件的过滤器
class FileFilterBySuffix implements FilenameFilter{
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
public static void main(String[] args) throws IOException {
File dir = new File("D:\\code_test\\demo1");
File[] files = dir.listFiles(new FileFilterBySuffix());
if (files != null) {
for (File file: files) {
System.out.println(file);
}
}
}
- FileFilter过滤器
当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter
,比如需要当前目录下的所有文件夹,就可以使用FileFilter
过滤器
//文件过滤器
class FileFileterByDir implements FileFilter{
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
public class FileDemo2 {
public static void main(String[] args) {
//获取扩展名为.java所有文件
//创建File对象
File file = new File("E:\\JavaSE1115\\code\\day11_code");
//获取指定目录下的文件夹
File[] files = file.listFiles(new FileFileterByDir());
//遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}
六、递归
- 直接递归: 方法自已调用自己
- 间接递归: A方法调用B方法,B方法调用C方法,C方法调用A方法
- 递归一定
要有条件限定
,保证递归能够停止下来,否则会发生栈内存溢出 - 在递归中虽然有限定条件,但是递归
次数不能太多
。否则也会发生栈内存溢出
文件操作中递归的使用:
/**
* 获取目录下所有文件包括子文件夹中的所有文件
*/
public class FileMethodDemo04 {
public static void main(String[] args) {
getFileAll(new File("D:\\code_test"));
}
public static void getFileAll(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
getFileAll(f); // 自己调自己
} else {
System.out.println(f);
}
}
}
}
}
递归三要素:
- 一定有一种可以退出程序的情况。
- 总是在尝试将一个问题化简到更小的规模。
- 父问题与子问题不能有重叠的部分。
七、文件队列
- 问题:
目录下子文件夹过多
→递归次数过多
→内存溢出
→遍历失败
- 解决: 遍历当前目录时,将文件对象拿出,文件夹对象加入队列。那么当前目录遍历结束后,可以将当前目录从容器中删除,接着遍历队列中子文件夹,重复上述过程。
public class FileDemo3 {
public static void main(String[] args) {
File file = new File("D:\\code_test\\demo1");
getFileAll(file);
}
//获取指定目录以及子目录中的所有的文件
public static void getFileAll(File file) {
//获取当前目录下的所有文件和文件夹
File[] files = file.listFiles();
//创建队列对象,存放目录
Queue<File> q = new Queue<>();
//遍历当前获取到的文件和文件夹对象
for(File f : files){
//判断当前遍历到的f对象,是否为目录
if(f.isDirectory()){
//是目录,就添加到队列中
q.add(f);
}else{
//不是目录就打印出
System.out.println(f);
}
}
while(!q.isNull()){
//获取队列中的目录
File fs = q.get();
File[] listFiles = fs.listFiles();
for(File f : listFiles){
//判断当前遍历到的f对象,是否为目录
if(f.isDirectory()){
//是目录,就添加到队列中
q.add(f);
}else{
//不是目录就打印出
System.out.println(f);
}
}
}
}
}
class Queue<T>{
private final LinkedList<T> link ;
//对外提供创建队列的对象
public Queue(){
this.link = new LinkedList<>();
}
//提供给队列中添加元素的方法
public void add(T t){
link.addLast(t);
}
//提供从队列中获取元素的方法
public T get(){
return link.removeFirst();
}
public boolean isNull(){
return link.isEmpty();
}
}