小东吖 之 java File类

本文详细介绍了Java中File类的基本用法、构造方法、常用方法及其文件操作,包括创建、删除文件及文件夹等,并提供了遍历文件夹和使用过滤器的具体实现。

File(文件类)

    尽管java.io定义的大多数类是实行流式操作的,File类不是。它直接处理文件和文件系统。也就是说,File类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。此外,File还浏览子目录层次结构。很多程序中文件是数据的根源和目标。尽管它们在小应用程序中因为安全原因而受到严格限制,文件仍是存储固定和共享信息的主要资源。Java中的目录当成File 对待,它具有附加的属性——一个可以被 list( )方法检测的文件名列表。
    下面的构造函数可以用来生成File 对象:
     File(String pathname)
     File(String parent, String child)
     File(File parent, String child)
     File(URI uri) 

这里,parent是文件的路径名,pathname 是文件名,child 是一个一级子目录 file: URI 是一个URI

一.基本方法

如何创建File实例
1.通过文件路径(字符串)来创建File实例
比如获取桌面的路径 (绝对路径)
比如获取当前路径 (相对路径)

// 绝对路径
String dtPath = "/Users/lanou/Desktop";
// 相对路径
String dtString = "src/log4j2.xml"

2.通过路径字符串构造出File实例

File file1 = new File(dtPath);
File file2 = new File(dtString);

3.验证实例是否正确

// 采用 exists() 判断是否存在
System.out.println(file1.exists());
System.out.println(file2.exists());

4.通过父级File对象,确定子级并生成File实例

    // File(File parent,String child)
    // 获取File对象 并确定子级路径字符串
    // dtFile | test
    File testFile = new File(file1, "test");
    // 生成子级File实例
    // 验证实例
    System.out.println(testFile.exists());

5.通过父级路径 子级路径生成File实例

    File file = new File(dtPath, "test");
    System.out.println(file.exists()); 

6.通过URI对象 生成File实例


    // 1.确定目标的URI 字符串形式
    String uriStr = "file:///users/xiaodong/Desktop/test";
    // 2.生成目录URI对象
    URI uri = null;
    try {
        uri = new URI(uriStr);
    } catch (URISyntaxException e) {
        fllog.warn("URI" + e.getMessage());
    }
    // 通过URI对象生成File实例
    // 注: File构造器可以解析file://协议uri
    File file3 = null;
    try {
         file3 = new File(uri);
    } catch (IllegalArgumentException e) {
         fllog.warn("IllegalArgumentException: " + e.getMessage());
    }
    System.out.println(file3.exists());
}

二.常用方法

1.判断File对象是否存在

File f1 = new File("src/log4j2.xml");
System.out.println("log4j.xml存在情况: " + f1.exists());

2.文件的大小

System.out.println("文件大小: " + f1.length())

3.空间

File dt = new File("/users/lanou/Desktop");
System.out.println("总空间: " + dt.getTotalSpace());
System.out.println("空余空间: " + dt.getFreeSpace());
System.out.println("可用空间: " + dt.getUsableSpace());

4.文件的相关判断

// 是否是文件夹
System.out.println("桌面是文件夹吗?" + dt.isDirectory());
// 是否是文件
System.out.println("xml是文件吗?" + f1.isFile());
// 获取项目根目录下.project 隐藏文件
File f = new File("./.project");
// 是否是隐藏文件
System.out.println(".project隐藏文件: " + f.isHidden());

5.是否是绝对路径
isAbsolute()

System.out.println("桌面是否是绝对路径: " + dt.isAbsolute());

6.文件本身操作

// 获取文件名
System.out.println("f1的文件名: " + f1.getName());
// 文件全名
System.out.println("f1的全名: " + f1.getPath());
// 拥有路径信息的全名
System.out.println("f1的全名: " + f1.getAbsolutePath());
// 获取父级
System.out.println("f1的父级名: " + f1.getParent());
// 返回是File的对象
System.out.println("f1的父级File: " + f1.getParentFile());

三.File文件的基础操作

1.创建文件
createNewFile();
首先获取存放文件的路径
确定有无后缀的文件名
创建目标文件

// 无后缀文件
File f1 = new File("file03","new1");
// 有后缀文件
File f2 = new File("file03","new1.txt")
boolean res = false;
try {
    res = f1.createNewFile();
    res = f2.createNewFile();
} catch (IOException e) {
    System.out.println("IOException: 文件创建失败");
}
    System.out.println("文件创建情况: " + res);

2.创建文件夹
mkdir();
获取存放文件夹的路径
确定所创文件的文件夹
创建目标文件

// 无后缀文件夹
File f3 = new File("file03","a")
// 有后缀文件夹
File f3 = new File("file03","b.big")

System.out.println("f3创建" + f3.mkdir());
System.out.println("f4创建" + f4.mkdir());

3.创建多层文件夹

private static boolean makeDirs1(File file) {
 // 1.当前文件夹如果存在 直接返回 (结束该文件夹操作)
    if (file.exists()) {
    return false;
   }
// 2.优先去处理父级文件夹 (如果父级是存在的 也会被步骤1的安全处理返回)
 makeDirs1(file.getParentFile());
 // 3.经过步骤2父级一定创建成功 所以可以直接创建本身
 return file.mkdir();
 }

四.文件夹的遍历

1.遍历文件夹的一级目录
获取目标文件
生成目标文件的夹的File对象
对其直接遍历操作

String path = "file04";
File target = new File(path);
// 获取String[]数组
String[] list = target.list();
for (String name : list) {
System.out.println(name);
}

也可以使用File类的相关方法进行遍历

File f = new File(path);
File[] files = f.listFiles();
for (File f : files) {
// 获取文件(夹)名
System.out.println(f.getName());
}

2.把文件夹下的文件及文件夹进行分类

// 可以封装成一个方法
private static String changeFile(File file) {
// 首先字符串初始化
    String string = "";
    if (string == "" && file.isDirectory()) 
    // 如果是文件夹 string被赋值为dir: 
        string = "dir: ";
    // 如果是文件夹 string被赋值为file: 
    if (string == "" && file.isFile()) 
        string = "file: ";
    // 如果是文件夹 string被赋值为hid: 
    if (string == "" && file.isHidden()) 
        string = "hid: ";
    // 返回字符串拼接
    return string + file.getName();
    }

3.遍历目标文件夹下的所有文件(文件及文件夹)
分析:
拿到目标文件对应的File对象
遍历该目标文件夹的一级目录
在遍历一级目录的过程中 会出现文件及文件夹(有无子目录)两种类型
对象 应该接着遍历

private static void trave(File file) {
        // 如果是文件 或者是 空文件夹 
        if (file.isFile() || file.list().length == 0) {
            return;
        }
        // 遍历一级目录
        for (File f : file.listFiles()) {
        // 直接打印一级目录的文件及文件夹
            System.out.println(f.getName());
            // 如果存在二级目录 递归处理
            if (f.isDirectory()) {
                trave(f);
            }

        }
    }

4.通过队列方式遍历目标文件夹

// 通过队列方式遍历目标文件夹
    private static Collection<File> list(File file) {
    // 判断是不是文件 是不是空文件夹
        if (file.isFile() || file.list().length == 0) {
            return null;
        }
        // 拥有储存所有遍历结果的集合
        Collection<File> coll = new ArrayList<>();
        // 拥有具有队列功能结构的集合(储存文件夹)
        // 队列功能: 先进先出(集合 | 可变)
        LinkedList<File> linkedList = new LinkedList<>();
        // 遍历一级目录
        for (File f : file.listFiles()) {
        // 将一级目录全部储存
            coll.add(f);
            if (f.isDirectory()) {
            // 该层级遍历
                linkedList.add(f);
            }
        }
        // 通过队列结构
        // 遍历的对象: 从队列中取出的第一个文件夹
        // 遍历的出口: 队列为空
        while (!linkedList.isEmpty()) {
            File pop = linkedList.pop();
            for (File f : pop.listFiles()) {
                coll.add(f);
                if (f.isDirectory()) {
                    linkedList.add(f);
                }
            }
        }
        return coll;
    }

五.删除文件file

1.步骤
获取目标文件
删除目标文件
验证是否删除成功

File target = new File("file05");

    boolean b = delete(target);
    if (b) {
        System.out.println("成功");
    }else {
        System.out.println("失败");
    }

结论:

文件及空文件夹可以直接删除
非空文件夹不可以直接删除

2.一次性删除非空文件夹

private static boolean deleteTargetFile(File file) {
     // 参数为空 需做安全处理 返回false
        if (file == null)
            return false;
        // 文件不存在 可以直接false
        if (!file.exists()) 
            return false;
        // 文件及空文件夹可以直接删除
        if (file.isFile()) 
            return file.delete();
        if (file.list().length == 0) 
            return file.delete();
        // 递归处理
        try {
            for (File f : file.listFiles()) {
            // 遇到文件夹优先(递归处理)
                if (f.isDirectory()) {
                    deleteTargetFile(f);
                }
                // 如果是文件可以直接删除
                f.delete();
            }
        } catch (Exception e) {
        // 删除是一个漫长的过程 处理可能出现的不可靠的失败情况
            return false;
        }
        return file.delete();

    }

过滤器

1.过滤器: 获取满足条件的目标文件
// File相关过滤器
// List(FilenameFilter filter)
// ListFile(FilenameFilter filter)
// ListFile(FileFilter filter)
// 获取过滤器过滤后的满足条件的File(String)数组

// 获取目标文件
File target = new File("file04");
// 获取目标文件的子目录中 满足条件的 一级文件(夹)
   生成条件(过滤器对对象)
MyFilenameFilter filter = new MyFilenameFilter(".txt");
// 获取满足条件目标 (过滤的目标)
File[] names = target.listFiles(filter);

实现过滤器接口

// 实现过滤器接口
public class MyFilenameFilter implements FilenameFilter {
    private String suffix;
    // 将过滤功能移交给外部,使代码的延展性更强
    public MyFilenameFilter(String suffix) {
        this.suffix = suffix;
    }
    // 参数列表
    // dir: file04 对应的File类型对象
    // name: file04文件夹下所有一级文件(夹)的文件名
    @Override
    public boolean accept(File dir, String name) {

        if (name.endsWith(suffix)) {
            return true;
        }
        return false;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值