Java SE | IO | File类

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()
  1. createNewFile() 创建文件对象,返回Boolean类型
File file = new File("hello.txt");
boolean b = file.createNewFile();  //当前路径下创建hello.txt文件  b=true
  1. 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()

  1. delete() 删除文件或目录
boolean b3 = file.delete();
  1. exists() 判断文件(夹)是否存在
boolean b4 = file.exists();
  1. 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);
		}
	}
}
  • 在获取指定目录下的文件或者文件夹时必须满足下面两个条件:
  1. 指定的目录必须是存在的,
  2. 指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException

五、文件过滤器

  • 筛选指定类型或指定格式的文件
  1. 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);
            }
      }
}
  1. 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方法
  1. 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
  2. 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出

文件操作中递归的使用:

/**
 * 获取目录下所有文件包括子文件夹中的所有文件
 */
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();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值