目 录CONTENT

文章目录

File类

FatFish1
2024-11-05 / 0 评论 / 0 点赞 / 64 阅读 / 0 字 / 正在检测是否收录...

File类简介

File类是java.io提供的一个实用类库工具,它的出现的目的是帮开发者处理文件目录问题(例如文件和目录的创建、查找和删除等操作)

File类的含义并不是“文件”,而是文件路径或路径集合(FilePath),可以从构造函数上来理解这段话的含义:

- public File(String pathname)  // 通过将给定的路径名 字符串转换为抽象类路径 来创建新的实例
- public File(String parent,String child)  // 从父路径字符串 和 子路径字符串创建新的File实例
- public File(File parent,String child)   // 从父抽象路径名 和 子路径名字符串创建新的File实例

注意:

  • 一个FIle代表的是硬盘中的一个路径或者一个文件

  • 无论该路径下是否存在文件或目录,都不影响File对象的创建

File类提供的能力和源码

核心成员变量

private static final FileSystem fs = DefaultFileSystem.getFileSystem();

File类中持有一个FileSystem对象,根据java运行环境不同,选择不同的对象,例如:

  • 处理Windows系统路径问题的WinNTFileSystem

处理绝对路径和相对路径

构造

可以使用绝对路径或相对路径构造一个File对象,只要能找到这个文件,File对象就可以获取到它的绝对路径

怎么理解呢,看这个例子:

File file1 = new File("D:\\myprojects\\MyTest\\src\\utils");
// 相对路径
File file2 = new File("MyTest\\src\\cn\\utils");
System.out.println(file1);
System.out.println(file2);

如果file1处于myprojects目录下,并且使用这段代码构造相对路径的File对象,就可以找到这个文件

获取

// 获取File对象指向文件的绝对路径,或用绝对路径构造File
public File getAbsoluteFile()
public String getAbsolutePath()

// 此路径方法返回绝对唯一的标准规范路径名。此方法首先将此路径名转换为绝对形式,就像调用getAbsolutePath方法一样,
// 然后以系统相关的方式将其映射到其唯一路径上
// 如果路径中包含“.”或“..”等当前路径及上层路径表示法,则会从路径名中删除“.”和“..”使用真实路径代替
// 如果对象是UNIX系统中的软连接,还会解析软连接到真实路径
public File getCanonicalFile()
public String getCanonicalPath()

// 获取此File对象构造时使用的路径,或其父路径
public String getPath()
public String getParent()

须注意的是:

  • 在UNIX系统中,通过将相对路径名解析为当前用户目录,使其成为绝对路径名;

  • 在WINDOWS系统中,通过将路径名解析为路径名所指定的驱动器的当前目录(如果有),使相对路径名成为绝对路径名; 如果没有,则针对当前用户目录解析

因此windows系统使用这些路径相关的能力,要注意盘符的影响

以getAbsoluteFile()为例看下源码:

public File getAbsoluteFile() {
    String absPath = getAbsolutePath();
    if (getClass() != File.class) {
        absPath = fs.normalize(absPath);
    }
    return new File(absPath, fs.prefixLength(absPath));
}

可见是将解析委托给了FileSystem#normalize方法

判断文件和目录

public boolean exists()  // 此File标识的文件或目录是否实际存在
public boolean isDirectory()  // 此File标识的是否为文件夹
public boolean isFile()  // 此file表示的是否为文件

创建和删除目录

public boolean creatNewFile()  //当 且仅当不存在该名称的文件时,创建一个新的空文件
public boolean mkdir()  //创建由File表示的目录
public boolean mkdirs()  //创建由File表示的目录,包括任何必须但不存在的父目录
public boolean delete()  //删除由此File表示的文件或目录,只能删除文件或者空文件夹,不能删除非空文件夹

目录遍历

public String[] list()  //返回一个String数组,表示该File目录中的所有子文件或目录的名称
public File[] listFiles()  //返回一个File数组,表示File目录中的所有子文件或目录的路径

遍历方法可以通过传入过滤器进行限制,包括以File为参数的过滤器,和以String为参数的过滤器

public File[] listFiles(FilenameFilter filter) {
    String ss[] = normalizedList();
    if (ss == null) return null;
    ArrayList<File> files = new ArrayList<>();
    for (String s : ss)
        if ((filter == null) || filter.accept(this, s))
            files.add(new File(s, this));
    return files.toArray(new File[files.size()]);
}

public File[] listFiles(FileFilter filter) {
    String ss[] = normalizedList();
    if (ss == null) return null;
    ArrayList<File> files = new ArrayList<>();
    for (String s : ss) {
        File f = new File(s, this);
        if ((filter == null) || filter.accept(f))
            files.add(f);
    }
    return files.toArray(new File[files.size()]);
}

从源码上可以看出来逻辑大致是相似的

0

评论区