File类概述:
文件和目录 路径名 的 抽象 表达形式
1. 一个File类对象 可以用来表示一个文件,或者一个目录
2. 一个File类对象表示的仅仅是 操作系统中 通过路径名所表述的文件或目录
3. 抽象表达形式? 抽象 和 物理存在相对
其实File对象表示的是一个 由一个 路径名 所确定的那个文件或目录,但是是由该路径名确定的文件或目录,并不一定物理存在。
File的构造方法:
// 创建一个File类对象,该File对象表示有pathname路径名字符串表示的路径名所确定的那个文件或目录
File (String pathname)
// 创建一个File对象,该File对象表示由parent(目标文件的父目录路径名字符串)和child(目标文件或目录,在parent父目录中的相对路径)共同确定
File (String parent, Sting child)
// 和构造方法2类似,只不过父目录路径,变成了用File对象表示
File (File parent, String child)
public class Demo1 {
public static void main(String[] args) {
// 第一种构造方法
//File (String pathname)
// 假设在操作系统的路径是: E:\demo\first\a.txt
File file = new File("E:\\demo\\first\\a.txt");
// 针对E:\demo\a.txt
file = new File("E:\\demo\\a.txt");
// 第二种构造方法
// 假设在操作系统的路径是: E:\demo\first\a.txt
String parent = "e:\\";
file = new File(parent, "demo\\first\\a.txt");
System.out.println(file);
// 第三种构造方法来创建
// E:\demo\first\a.txt
File dir = new File("E:\\demo\\first");
file = new File(dir, "a.txt");
System.out.println(file);
}
}
API
1.创建功能
(1). 创建文件:
public boolean createNewFile() 创建当前File对象所表示的文件
(2). 创建目录:
创建当前File对象所表示的目录
public boolean mkdir()
public boolean mkdirs()
mkdir 和 mkdirs创建目录的区别:
a. mkdir仅能在已经存在的目录下,创建新的目录
b. mkdirs 如果目标目录的父目录不存在的时候,它会将不存在的目标目录的父目录 连同目标目录一起,都创建好。
public class Demo1Create {
public static void main(String[] args) throws IOException {
//创建目标文件 E:\demo\first\b.txt
File file = new File("E:\\demo\\first\\b.txt");
//public boolean createNewFile() 创建当前File对象所表示的文件
boolean newFile = file.createNewFile();
//System.out.println(newFile);
// 创建表示目标目录的File对象 E:\demo\third 目录
String parent = "E:\\demo";
File thirdDir = new File(parent, "third");
//public boolean mkdir()
boolean mkdir = thirdDir.mkdir();
//System.out.println(mkdir);
//public boolean mkdirs() E:\demo\fourth\me 目标目录
File parentDir = new File("e:\\demo\\fourth");
File meDir = new File(parentDir, "me");
// mkdir 创建失败
mkdir = meDir.mkdir();
System.out.println(mkdir);
boolean mkdirs = meDir.mkdirs();
System.out.println(mkdirs);
}
}
2.删除功能
public boolean delete()
(1). 删除此抽象路径名表示的文件或目录。
(2). 如果此路径名表示一个目录,则该目录必须为空才能删除。
public class Demo2Delete {
public static void main(String[] args) {
// 测试删除一个文件
File file = new File("e:\\demo\\a.txt");
//删除文件
boolean delete = file.delete();
System.out.println(delete);
//删除非空目录
File notNullDir = new File("e:\\demo\\first");
boolean delete1 = notNullDir.delete();
System.out.println(delete1);
//删除空目录
File nullDir = new File("E:\\demo\\non");
boolean delete2 = nullDir.delete();
System.out.println(delete2);
}
}
3.重命名功能
public boolean renameTo(File dest)
将当前的File对象所表示的文件或者目录,重命名为dest File对象所表示的文件或目录
file.renameTo(dest)
(1). 当在源文件和修改之后的目标文件在同一目录的时候:效果只是重命名
(2). 当源文件和修改之后的目标文件不在同一目录的时候:
a. 移动文件
b. 重命名
public class Demo3Rename {
public static void main(String[] args) {
// 创建源文件对象
File file = new File("e:\\demo\\first\\a.txt");
// 重命名的目标文件
File targetFile = new File("e:\\demo\\first\\aaa.txt");
File destFile = new File("e:\\demo\\second\\aaa.txt");
// 重名名(源文件和目标文件的路径在同一目录下)
boolean b = file.renameTo(targetFile);
System.out.println(b);
//重名名(源文件和目标文件的路径不在同一目录下)
b = file.renameTo(destFile);
System.out.println(b);
}
}
4.判断功能
public boolean isFile() // 判断File对象是否表示的是一个文件
public boolean isDirectory() //判断File对象是否表示的是一个目录
public boolean exists() //判断,File对象表示的文件,是否物理存在
public boolean canRead() // 判断File对象表示的文件,是否可读
public boolean canWrite() // 判断File对象表示的文件,是否可写
public boolean isHidden() // 判断文件是否是隐藏文件,判断File对象表示的文件是否是隐藏文件
public class Demo4Judge {
public static void main(String[] args) {
//目标目录
File dir = new File("e:\\demo\\first");
//public boolean isFile() // 判断File对象是否表示的是一个文件
System.out.println(dir.isFile()); //false
System.out.println(dir.isDirectory()); //true
// public boolean exists() //判断,File对象表示的文件,是否物理存在
File file = new File("e:\\demo\\first\\b.txt");
System.out.println(file.exists());
file = new File("e:\\demo\\6379");
System.out.println(file.exists());
}
}
5.基本获取功能
public File getAbsolutePath() //获取File对象表示的抽象文件的绝对路径
public String getPath() //获取File对象表示的抽象文件,路径名字符串
public String getName() //获取文件或者目录的名字
public long length()
返回由此抽象路径名表示的文件的长度。
如果此路径名表示一个目录,则返回值是不确定的。
此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L
public long lastModified()
返回此抽象路径名表示的文件最后一次被修改的时间。
表示文件最后一次被修改的时间的 long 值,用与时间点(1970 年 1 月 1 日,00:00:00 GMT)之间的毫秒数表示
public class Demo5Get {
public static void main(String[] args) {
// 相对路径File对象
File file = new File("files\\a.txt");
// 获取File对象表示的绝对路径
System.out.println(file.getAbsolutePath()); //E:\wangdao\24th\file\files\a.txt
// 获取文件的路径名字符串
System.out.println(file.getPath()); // files\a.txt
// 文件名(包括文件的类型后缀)
System.out.println(file.getName()); //a.txt
System.out.println("----------------------------------------------------------------------");
file = new File("E:\\wangdao\\24th\\file\\files\\a.txt");
System.out.println(file.getAbsolutePath()); //E:\wangdao\24th\file\files\a.txt
// 获取文件的路径名字符串
System.out.println(file.getPath()); //E:\wangdao\24th\file\files\a.txt
// 文件名(包括文件的类型后缀)
System.out.println(file.getName()); //a.txt
// 绝对路径: 盘符:\\路径
// 相对路径: tmp\a.txt
// 这种路径,jdk会自动补充一个盘符,工作目录所在的盘的盘符:
File file1 = new File("\\ccc.txt");
System.out.println(file1.getAbsolutePath());
// public long length()
File file2 = new File("E:\\wangdao\\24th\\file\\files\\a.txt");
long length = file2.length();
System.out.println(length);
}
}
6.高级获取功能
public String[] list()
a. 返回一个字符串数组,这些字符串 指定 此抽象路径名表示的目录中 的 文件 和 目录。
b. 如果此抽象路径名不表示一个目录,那么此方法将返回 null。
c. 否则返回一个字符串数组,每个数组元素对应目录中的每个文件或目录。
d. 每个字符串是一个文件名,而不是一条完整路径。(不会递归获取,当前目录下的子目录中的内容)
public File[] listFiles()
a.返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
b.如果此抽象路径名不表示一个目录,那么此方法将返回 null。
c. 否则返回一个 File 对象数组,每个数组元素对应目录中的每个文件或目录。
public class Demo6HighGet {
public static void main(String[] args) {
// 创建目标目录
File dir = new File("e:\\demo\\first");
// 创建文件
File file = new File("e:\\demo\\test.txt");
// public String[] list()
String[] list = dir.list();
System.out.println(Arrays.toString(list));
//如果此抽象路径名不表示一个目录,那么此方法将返回 null。
String[] list1 = file.list();
System.out.println(list1);
File[] files = file.listFiles();
System.out.println(files);
}
}
7.自定义获取功能
File[] listFiles(FileFilter filter)
获取当前目录中,满足 指定条件的 目标目录或者目标文件的File对象集合
描述过滤规则:
对于一个File对象,如果accept方法返回true,就说明该File对象满足指定条件
否则,如果accept方法,返回false,则说明不满足指定条件(过滤条件)
interface FileFilter {
boolean accept(File pathname)
测试指定File对象(文件或者子目录)是否满足过滤条件(指定条件)。
}
注意事项:
(1). 一个FileFilter(子类)对象,表示一个具体的过滤条件
(2). 又因为具体的过滤条件根据需求可以各不相同,所以具体的过滤条件视同FileFilter子类实现的accept来具体实现的
public class Demo7HighGet2 {
public static void main(String[] args) {
// 创建目标目录
File targetDir = new File("E:\\demo\\first");
// listFiles()
File[] files = targetDir.listFiles();
System.out.println(Arrays.toString(files));
// File[] listFiles(FileFilter filter)
// 我要获取当前目录下的.txt文件的File对象
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File pathname) {
// 实现一个具体的过滤条件, 当带判断的File对象实际表示一个.txt文件的时候,返回true
// 否则,则返回false
if (pathname.isDirectory()) {
// 如果是目录,则不满足条件,返回false
return false;
}
// 获取带判断的File对象所表示的文件的文件名
String name = pathname.getName();
return name.endsWith(".txt");
}
};
// 获取目标目录中,满足指定条件的File对象集合(使用jdk中的listFiles(filter))
File[] targetFiles = targetDir.listFiles(filter);
System.out.println(Arrays.toString(targetFiles));
// 使用自己的方法,实现和jdk的 listFiles相同的功能
File[] byCondition = findByCondition(targetDir, filter);
System.out.println(Arrays.toString(byCondition));
}
/*
在指定目录中,查找满足条件的子文件或子目录对应的File对象
*/
public static File[] findByCondition(File targetDir, FileFilter condition) {
// 一个ArrayList对象就是一个动态数组,其长度是会自动增长的
ArrayList<File> result = new ArrayList<>();
// 遍历目标目录中的每一个子文件或者子目录
File[] files = targetDir.listFiles();
for (int i = 0; i < files.length; i++) {
// 逐个判断是否满足条件
if (condition == null || condition.accept(files[i])) {
// 满足条件
result.add(files[i]);
}
}
// 把ArrayList动态数组,转化成一个对应类型普通数组
return result.toArray(new File[0]);
}
}