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()]);
}
从源码上可以看出来逻辑大致是相似的
评论区