File类概述
因为数据在硬盘上最常见的方式,就是文件。而文件本身有很多的属性,比如说:文件大小,是否可读,是否隐藏
等。那么,java为了方便我们对文件进行操作,就提供了File类供我们使用。
一个File对象,既可以表示一个文件,也可以用来表示文件夹。理解了这个,对之后学习File类有莫大的好处,最起码能一下看得出当前的file对象到底指的是目录(文件夹)还是文件。
File类的三个构造方法:
A:File(String pathname):根据指定的路径创建File对象。
B:File(String parent, String child):根据指定的父文件夹和子文件或者文件夹创建File对象
C:File(File parent, String child):根据指定的父文件夹对象和子文件或者文件夹创建File对象
代码如下:
public class FileDemo {
public static void main(String[] args) {
// 方式1
File file = new File("d:\\a.txt");
File file2 = new File("d:\\aaa");
// 方式2
File file3 = new File("d:\\", "a.txt");
File file4 = new File("d:\\", "aaa");
// 方式3
File file5 = new File("d:\\");
File file6 = new File(file5, "a.txt");
File file7 = new File(file5, "aaa");
}
}
注意:执行这段代码后,并没有在创建出这些目录和文件夹。这三个构造方法的作用是,将各自的file对象,指向了各自的目录和文件。
要想创建出这些文件和目录,需要进一步操作。
File类的创建功能:
A:创建文件:public boolean createNewFile() — 创建文件,如果指定的文件不存在就创建,否则不创建
B:创建文件夹;
a:public boolean mkdir() — 创建指定的目录,如果目录已存在,就不创建
b:public boolean mkdirs() — 创建指定的目录,这个时候,可以创建多级目录,若父目录不存在,也一并创建
ps…绝对路径和相对路径
A:绝对路径:以盘符开始的路径,如:E:\0714深圳黑马基础班\day20
B:相对路径:不以盘符开始的路径,如:test\aaa
代码:
public class FileDemo {
public static void main(String[] args) throws IOException {
// 创建文件
File file = new File("d:\\a.txt");
System.out.println("createNewFile:" + file.createNewFile());
// 创建文件 忘了写路径名称了,以当前项目路径所在路径为父目录
File file2 = new File("a.txt");
System.out.println("createNewFile:" + file2.createNewFile());
// 创建目录
File file3 = new File("aaa");
System.out.println("mkdir:" + file3.mkdir());
// 创建多级目录 如果想创建一个指定的目录或者文件,要求,父目录必须存在。
// File file4 = new File("bbb\\ccc");
// System.out.println("mkdir:" + file4.mkdir());
// 解决方案:
// File file5 = new File("bbb");
// File file6 = new File(file5, "ccc");
// System.out.println("mkdir:" + file5.mkdir());
// System.out.println("mkdir:" + file6.mkdir());
// 如果目录过多,这样做就太麻烦。肿么办呢?
File file4 = new File("bbb\\ccc");
System.out.println("mkdirs:" + file4.mkdirs());
// 创建文件
File file5 = new File("b.txt");
System.out.println("mkdir:" + file5.mkdir());
}
}
结果:
这里需要特别注意的一点时,在创建文件或者文件夹时,一定要明确自己需要的时什么,不要调用了错误的方法,造成一些比较隐蔽的错误。
File类的判断功能:
删除功能:
public boolean delete():既可以删除文件,也可以删除文件夹。取决于你使用的对象。
需要注意的地方:
A:如果要删除的目录下还有内容,那么必须要先把所有内容删除干净后,才能删除该目录
B:特别注意:Java语言的删除不走回收站。别乱删文件,到时欲哭无泪。
代码:
public class FileDemo {
public static void main(String[] args) {
// 需求:我要删除a.txt
File file = new File("a.txt");
System.out.println("delete:" + file.delete());
// 需求:我要删除aaa
File file2 = new File("aaa");
System.out.println("delete:" + file2.delete());
// 需求:我要删除bbb
File file3 = new File("bbb");
System.out.println("delete:" + file3.delete());
}
}
结果:
分析:
最后一个结果为false,是因为在bbb目录下,还有一个ccc目录,必须先删除ccc目录以及ccc目录下所有内容,bbb才能被删除
File类的判断功能:
boolean exists():判断file对象是否存在
boolean isFile():判断file对象是否是文件
boolean isDirectory():判断file对象是否是文件夹
boolean isAbsolute():判断file对象是否是绝对路径
boolean canRead():判断file对象是否可读
boolean canWrite():判断file对象是否可写
boolean isHidden():判断file对象是否隐藏
这些判断功能,主要用在我们需要对文件夹遍历,遍历过程中,需要对文件或者文件夹进行一些操作时,判断,符合条件的,我们才进行实质性的操作
代码:
public class FileDemo {
public static void main(String[] args) {
File file = new File("a.txt");
System.out.println("exists:" + file.exists());// true
System.out.println("isFile:" + file.isFile());// true
System.out.println("isDirectory:" + file.isDirectory());// false
System.out.println("isAbsolute:" + file.isAbsolute());// false
System.out.println("canRead:" + file.canRead());// true
System.out.println("canWrite:" + file.canWrite());// true
System.out.println("isHidden:" + file.isHidden());// false
}
}
结果:
分析:
这里的结果,没有可比性,每个人的文件系统里面是否包含这些文件,决定这里的值。
File类的获取功能1:
String getAbsolutePath():绝对路径
String getPath():相对路径
String getName():文件名称
long length():文件大小,单位是字节
long lastModified():上次修改时间的毫秒值。
代码:
public class FileDemo {
public static void main(String[] args) {
// 需求:指向文件
File file = new File("bbb\\ccc\\a.txt");
System.out.println("getAbsolutePath:" + file.getAbsolutePath());
System.out.println("getPath:" + file.getPath());
System.out.println("getName:" + file.getName());
System.out.println("length:" + file.length());
System.out.println("lastModified:" + file.lastModified());
Date d = new Date(file.lastModified());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(d));
}
}
结果:
File类的获取功能2:
public static File[] listRoots():列出可用的系统文件根目录
public String[] list():返回的是指定目录下所有文件或者文件夹的名称数组
public File[] listFiles():返回的是指定目录下所有文件或者文件夹对象数组
这里的获取功能,可以用于遍历某个目录下的所有文件和文件夹,并输出需要的结果
代码:
public class FileDemo {
public static void main(String[] args) {
// public static File[] listRoots()
// File[] rootArray = File.listRoots();
// for (File root : rootArray) {
// System.out.println(root);
// }
// 创建对象
File file = new File("d:\\");
// public String[] list()
// String[] strArray = file.list();
// for (String str : strArray) {
// System.out.println(str);
// }
// public File[] listFiles()
File[] fileArray = file.listFiles();
for (File f : fileArray) {
System.out.println(f.getName());
}
}
}
综合应用强调内容
需求:获取指定目录下指定后缀的文件名称:
方法一:先获取指定目录下所有文件或者文件夹的File数组,然后再遍历的时候进行判断。满足条件的就输
出该File的名称。
方法二:直接获取指定目录下满足条件的String(File)数组。然后遍历数组即可。
方法二相对比较方便,但是需要用到FileNameFilter文件名称过滤器类还有带参的list(filter)方法
public String[] list(FileNameFilter filter)
代码:
public class FileDemo {
public static void main(String[] args) {
// 封装目录
File file = new File("d:\\");
// 获取满足条件的数组
String[] strArray = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 判断是否是文件,是否是以.mp4结尾
// System.out.println(dir + "---" + name);
File file = new File(dir, name); // d:\我的文档
boolean flag = file.isFile();
boolean flag2 = name.endsWith(".mp4");
return flag && flag2;
}
});
// 遍历字符串数组
for (String str : strArray) {
System.out.println(str);
}
}
}