javaIO之File类的讲解

一、File

File类概述

File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)

使用File可以做到:

1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等

2:创建和删除文件或目录

3:访问一个目录中的子项

获取文件及其属性

length(): 返回文件的长度, 单位是字节数(如果File是目录, 则返回0)
exists(): 判断当前文件或目录是否存在,存在则返回true
isFile(): 判断当前file是否为文件,是文件则返回true
isDirectory(): 判断当前file是否为目录,是目录返回true
getName(): 获取当前File文件或目录的名字
getParent(): 获取当前File父目录的路径
getAbsolutePath(): 获取当前File文件或目录的完整路径

代码案例

package file;

import java.io.File;

/**
 * 该案例测试File类
 */
public class FileDemo {
    public static void main(String[] args) {
        //访问当前项目中的demo.txt文件
        /*
            使用File的构造方法创建对象,参数是引入文件的路径
            1.绝对路径:从盘符开始,到文本名为止的路径 一般不会使用这个路径的,因为跨平台性太差
            D:\Dates\IDEASPACE\CGBVN2112JAVASE\demo.txt
            2.相对路径:则是相对当前项目而言
                ./ 表示当前目录,也可以省略
         */
        //new File("D:/Dates/IDEASPACE/CGBVN2112JAVASE/demo.txt");
        File file = new File("./DAY02/demo.txt");
        //获取当前文件的名字
        System.out.println(file.getName());
        //获取当前文件是否是一个文件
        System.out.println(file.isFile());
        //获取当前文件的大小 单位是字节
        System.out.println(file.length());//35
        //获取当前文件是否可读
        System.out.println(file.canRead());
        //获取当前文件是否可写
        System.out.println(file.canWrite());
        //获取当前文件是否隐藏
        System.out.println(file.isHidden());
    }
}

创建文件

createNewFile(): 创建指定路径和名称的文件, 如果文件不存在, 则创建并返回true, 否则就不创建并返回false

代码案例

package file;

import java.io.File;
import java.io.IOException;
/**
 * 测试创建指定的路径或文件
 */
public class CreateFileDemo {
    public static void main(String[] args) throws IOException {
        //在当前的项目目录下,创建一个test.txt文件
        //1.先将文件的路径封存到File对象中
        File file = new File("./test.txt");
        //2.如果文件不存在,就创建改文件
        if(file.exists()){//exists 判断当前的文件是否存在,如果存在返回true,否则返回false
            System.out.println("当前文件已经存在了");
        }else{
            //创建改文件
            file.createNewFile();//create 创建 new 新的 file 文件
            System.out.println("文件创建成功");
        }
    }
}

删除文件

delete(): 删除文件或删除空目录, 删除成功返回true(非空目录删除会失败)

代码案例

package file;

import java.io.File;

/**
 * 测试删除指定文件
 */
public class DeleteFileDemo {
    //shift+enter 可以快速将光标跳转到下一行
    // crtl+/ 生成单行注释
    /* ctrl+shift+/ */
    public static void main(String[] args) {
        //删除test.txt文件
        File file = new File("./test.txt");
        if(file.exists()){
            file.delete();//删除文件 此处的删除是真的删除了
            System.out.println("文件已经删除");
        }else{
            System.out.println("文件不存在");
        }

    }
}

创建目录

mkdir(): 创建指定路径和名称的目录, 如果目录不存在, 则创建并返回true, 否则就不创建并返回false
mkdirs(): 创建指定路径和名称的多级目录, 如果目录不存在, 则创建并返回true, 否则就不创建并返回false

代码案例

package file;

import java.io.File;
import java.io.IOException;

/**
 * 测试创建指定的路径的目录
 */
public class MKDirDemo {
    public static void main(String[] args) {
        //当前目录下新建一个目录:test 目录是没有后缀的
        //File file = new File("./test");
        File file = new File("./a/b/c/d/e/f/g/h");
        if(file.exists()){//判断当前目录是否存在
            System.out.println("目录已存在");
        }else{
            /*
                mkdir 创建单个目录
                mkdirs 创建嵌套目录
             */
            file.mkdirs();
            System.out.println("目录已创建");
        }
    }
}

删除目录

delete(): 删除文件或删除空目录, 删除成功返回true(非空目录删除会失败)

代码案例

package file;

import java.io.File;

/**
 * 测试删除指定目录
 */
public class DeleteDirDemo {
    public static void main(String[] args) {
        //删除test目录
        File file = new File("./test");
        //删除目录,该目录必须是一个空目录,如果该目录下有文件或者目录,都不能删除
        //File file = new File("./a");
        if(file.exists()){
            file.delete();//删除目录 此处的删除是真的删除了
            System.out.println("目录已经删除");
        }else{
            System.out.println("目录不存在");
        }
    }
}

获取目录中的子项

代码案例

package file;

import java.io.File;
import java.util.Arrays;

/**
 * 获取一个目录中的子项
 */
public class ListFilesDemo {
    public static void main(String[] args) {
        //获取当前项目的所有的子项
        File dir = new File(".");
        /*
            boolean isFile()
            判断当前的File表示的是否是一个文件
            boolean isDirectory()
            判断当前的File表示的是否是一个目录
         */
        if(dir.isDirectory()){//只有当是目录时,才可以获取子项
            //listFiles 返回的是一个装有File类型的数组
            //只能获取目录下的一级目录内容
            File[] files = dir.listFiles();
            System.out.println(
                    dir.getAbsolutePath()+"有"+files.length+"子项");
            for(int i=0 ; i<files.length; i++){
                System.out.println(files[i]);
            }
        }
    }
}

递归遍历目录

递归(recursion)是一种常见的解决问题的方法,即把问题逐渐简单化。

递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。

 m();
 ...
 public void m(){
   ...
   m();
   ...
 }

需要注意的是: 递归方法一定要有出口, 否则将会一直自己调用自己, 变成死循环, 严重时将会导致内存溢出!

需求: 遍历指定File(目录)下的所有子目录和子文件, 输出该目录下的所有目录和文件名

思路: 声明一个diGui目录的方法, 接收一个File类型的对象, 方法内部实现如下: 
1.判断当前File是否为文件(防止第一次传入的是文件)
  1.1.如果file是文件, 输出: "文件不支持递归!"
  1.2.如果file是目录, 则继续执行第2步
2.获取当前目录下的所有子目录及子文件对象组成的File数组
3.遍历当前目录下的所有子目录及子文件对象
4.判断当前遍历的是目录还是文件
  4.1.如果当前遍历的是文件, 输出该文件的路径+名称
  4.2.如果当前遍历的是目录, 输出当前目录的路径+名称
  并以此目录作为根, 接着遍历该目录下的所有子目录和子文件, 输出该目录下的所有目录和文件名

统计一个目录下所有文件的大小之和

代码案例
package file;

import java.io.File;
import java.util.Arrays;

/**
 * 递归查询目录的所有子项
 */
public class ListDirDGDemo {
    public static void main(String[] args) {
        //指定递归的目录
        File file = new File("./a");
        //调用一个递归的方法,递归上面的file对象
        diGuiFolder(file);
        //通过该方法,可以获取指定目录的子文件的总和大小
        long size = diGuiSumFolder(file);
        System.out.println("文件总大小:"+size+"字节");
    }
    private static long diGuiSumFolder(File file) {
        //0.声明一个变量,用于记录累加的文件大小
        long total = 0;
        //1.判断当前File是否为文件(防止第一次传入的是文件)
        if (file.isFile()){
            //1.1.如果file是文件, 输出: "文件不支持递归!"
            System.out.println("文件不支持递归");
            return file.length();
        }else {
            //1.2.如果file是目录, 则继续执行第2步
            //2.获取当前目录下的所有子目录及子文件对象组成的File数组
            File[] files = file.listFiles();
            //3.遍历当前目录下的所有子目录及子文件对象
            for (int i = 0; i < files.length; i++) {
                //4.判断当前遍历的是目录还是文件
                if(files[i].isFile()){
                    //4.1.如果当前遍历的是文件, 计算该文件的大小
                    total += files[i].length();
                }else{
                    //4.2.如果当前遍历的是目录, 输出当前目录的名称
                    System.out.println("目录名:"+files[i]);
                    //并以此目录作为根,接着遍历该目录下的所有子目录和子文件,
                    //调用当前递归方法,然后回去目录下子文件的大小,累加到total变量上
                    total += diGuiSumFolder(files[i]);
                }
            }
        }
        return total;
    }
    private static void diGuiFolder(File file) {
        //1.判断当前File是否为文件(防止第一次传入的是文件)
        if (file.isFile()){
            //1.1.如果file是文件, 输出: "文件不支持递归!"
            System.out.println("文件不支持递归");
            return;
        }else {
            //1.2.如果file是目录, 则继续执行第2步
            //2.获取当前目录下的所有子目录及子文件对象组成的File数组
            File[] files = file.listFiles();
            //3.遍历当前目录下的所有子目录及子文件对象
            for (int i = 0; i < files.length; i++) {
                //4.判断当前遍历的是目录还是文件
                if(files[i].isFile()){
                    //4.1.如果当前遍历的是文件, 输出该文件的名称
                    System.out.println("文件名:"+files[i]);
                }else{
                    //4.2.如果当前遍历的是目录, 输出当前目录的名称
                    System.out.println("目录名:"+files[i]);
                    //并以此目录作为根,接着遍历该目录下的所有子目录和子文件,
                    //输出该目录下的所有目录和文件名
                    diGuiFolder(files[i]);
                }
            }
        }
    }
}

递归删除目录

代码案例
package file;

import java.io.File;

/**
 * 递归删除目录
 */
public class DeleteDirDGDemo {
    public static void main(String[] args) {
        File file = new File("./a");
        //递归删除目录的方法
        diGuiDeleteFolder(file);
    }
    private static void diGuiDeleteFolder(File file) {
        //1.判断当前File是否为文件(防止第一次传入的是文件)
        if (file.isFile()){
            //1.1.如果file是文件, 输出: "文件不支持递归!"
            System.out.println("文件不支持递归");
            return;
        }else {
            //1.2.如果file是目录, 则继续执行第2步
            //2.获取当前目录下的所有子目录及子文件对象组成的File数组
            File[] files = file.listFiles();
            //3.遍历当前目录下的所有子目录及子文件对象
            for (int i = 0; i < files.length; i++) {
                //4.判断当前遍历的是目录还是文件
                if(files[i].isFile()){
                    //4.1.如果当前遍历的是文件, 输出该文件的名称
                    System.out.println(
                            "成功的删除了["+file.getName()+
                                    "]目录下的"+files[i]);
                    //执行删除
                    files[i].delete();
                }else{
                    //并以此目录作为根,接着遍历该目录下的所有子目录和子文件
                    diGuiDeleteFolder(files[i]);
                }
            }
        }
        //删除file目录
        file.delete();
        System.out.println("成功删除["+file.getName()+"]目录");
    }
}

获取一个目录中符合过滤条件的所有子项

代码案例
package file;

import java.io.File;
import java.io.FileFilter;

/**
 * 获取一个目录中符合过滤条件的所有子项
 * 重载的listFiles方法
 * File[] listFiles(FileFilter filter)
 * 该方法要求传入一个文件过滤器,然后将仅满足过滤器要求的子项进行返回
 */
public class ListFilesDemo2 {
    public static void main(String[] args) {
        File file = new File(".");
        /*
            java语法要求:接口不能被直接实例化,想要创建接口对象,只能
            创建一个新的类,实现该接口,创建子类实例
            匿名内部类,省略中间创建的子类的过程
            1.省略子类类名
            2.new 接口名(){
                实现接口中未实现的方法
            };
         */
        FileFilter filter = new FileFilter() {
            //在accept方法中书写,过滤的规则
            @Override
            public boolean accept(File pathname) {
                //过滤文件名中包含o的文件
                String name = pathname.getName();
                System.out.println("正在过滤的元素:"+name);
                //包含返回true,否则false
                return name.contains("o");
            }
        };
        //如果过滤器中过滤的元素返回的是true,就添加到files数组中,否则就不添加到数组中
        File[] files = file.listFiles(filter);
        for (int i = 0; i < files.length; i++) {
            System.out.println(files[i]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值