为什么要学习File类?
因为在操作系统中,需要永久保存的数据都是以文件的形式存在,所以要想操作这些被永久保存的数据首先要学会在java语言中如何描述和表示文件。
一、概述
File类:文件和目录路径名的抽象表示形式。
一个File类对象,表示一个文件或者一个目录。它描述的就是一个路径名字符串所表示一个文件或目录。
抽象的含义和物理存在的含义相对,一个File类对象表示操作系统中(路径名所指向的逻辑上存在的,而不一定是物理上真实存在的)的一个文件或者一个目录。所以,可以认为,一个File对象和路径名字符串在表示操作系统文件这个层面,他们等价。
二、文件路径
1.路径名
绝对路径:绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的文件。
windows操作系统下: f:\devlopment\a.txt
相对路径: 相对路径名必须使用取自其他路径名的信息进行解释 (相对对父路径) ,是一个不完整的路径名。
windows操作系统下:develop\b.txt
java语言中,相对路径默认相对于谁?
默认情况下,java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir 指定。
2.路径表示
- 类UNIX
对于UNIX 平台,绝对路径名的前缀始终是 “/”。相对路径名没有前缀。 表示根目录的绝对路径名的前缀为“/”,且名称序列为空。
绝对路径: /dir/file.txt
相对路径: dir/a.exe
根目录: / - 对于 Microsoft Windows 平台
包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 "\“
绝对路径: e:\dir\a.txt(盘符不区分大小写)
相对路径:没有盘符前缀 dir\a.txt
特殊字符的表示,给n这个字符前面加一个\,输出的不是n这个字符,而是一个换行符。\表示转义,是一个转义字符。
\本身表示的含义是转义,但本身有一个\字符。两个\表示的是\本身。
3.File的构造方法:
- File (String pathname)
创建一个File对象,该File对象表示文件或者目录,就是指pathname这个路径名字符串所表示操作系统中的文件或目录。 - File (String parent, Sting child)
- File (File parent, String child)//其中一个参数是File类对象
三、 api
- 创建
public boolean createNewFile() //在操作系统上物理创建文件
public boolean mkdir() //物理创建目录
public boolean mkdirs()//物理创建目录
makir和mkdirs的区别:
当目标目录的父目录不存在的时候,mkdir()会创建目标目录失败。
当目标目录的父目录不存在的时候,mkdirs()会连同目标目录和不存在的父目录,一起创建出来。
-
删除
public boolean delete() //删除此抽象路径名表示的文件或目录。
如果此路径名表示一个目录,则该目录必须为空才能删除。 -
重命名
public boolean renameTo(File dest)//对当前File对象所表示的文件或者目录重命名,将其重命名为参数File对象所表示的文件的文件名。
如果是目标文件对象和当前文件对象,在同一目录下,实现的效果就是重命名。
如果是目标文件对象和当前文件对象,不在同一目录下,除了重命名,还有文件移动效果。
-
判断功能
public boolean isFile() //判断当前File对象是否表示文件
public boolean isDirectory() //判断当前File对象是否表示目录
public boolean exists() //物理判断File对象表示的文件或目录是否真的存在
public boolean canRead() //判断文件是否可读
public boolean canWrite() //判断文件是否可写
public boolean isHidden() //判断文件是否隐藏文件 -
获取功能
public File getAbsoluteFile() //获取文件的绝对路径字符串
public String getPath() //获取文件的路径字符串
public String getName() //获取文件的文件名
public long length(),//返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。大小单位为字节
public long lastModified() //表示文件最后一次被修改的时间的 long 值,用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示 -
高级获取功能(只针对目录)
public String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 每个字符串是一个文件名,而不是一条完整路径。
如果此抽象路径名不表示一个目录,那么此方法将返回 null。
public File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
如果此抽象路径名不表示一个目录,那么此方法将返回 null。 -
自定义获取功能
自定义在哪里呢? 就是我们可以自己指定所要查找的文件需要满足的过滤条件。
list或listFiles方法的参数,它们都是用来表示,自己定义的过滤条件的
File[] listFiles(FileFilter filter)
String[] list(FilenameFilter filter)
File[] listFiles(FilenameFilter filter)
两种表示过滤条件的接口
public interface FilenameFilter
public interface FileFilter
File[] listFiles(FileFilter filter)
FileFilter: 文件过滤器
public interface FileFilter {
// pathname该File对象,表示的待判断File对象
// 如果该方法返回true:表示带判断的pathname File对象满足条件
// 如果该方法返回false:表示带判断的pathname File对象不满足条件(要被过滤掉)
boolean accept(File pathname)
}
假设如下场景:
我们不想获取目标目录中所有子文件或子目录的File对象,我们只想要获取一些满足特殊条件的子文件或者子目录的File对象。
比如: 我只想获取目标目录中,代表.txt文件的File对象
File dir = new File("e:\\demo");
//利用匿名内部类对象,创建一个FileFilter对象,表示一种具体的过滤条件
FileFilter filter = new FileFilter() {
// 过滤条件就是在这里实现的
@Override
public boolean accept(File targetFile) {
if (targetFile.isDirectory()) {
// 如果是目录,不满足条件
return false;
}
String name = targetFile.getName();
// 判断如果是txt文件返回true,否则返回false
return name.endsWith("txt");
}
};
File[] files = dir.listFiles(filter);
System.out.println(Arrays.toString(files)); //[e:\demo\a.txt]
#个人学习记录,如发现有错误之处,欢迎与我交流