File类的相关方法
java.io.File类
-
文件和路径名的抽象表达形式
-
java把电脑中的文件和文件夹(目录)封装了一个File类,我们可以使用File类对文件和文件夹进行如下操作
- 创建一个文件/文件夹
- 删除
- 获取
- 判断文件/文件夹是否存在
- 文件夹遍历
- 获取文件大小
注:File类是一个与系统无关的类,任何的操作系统都可以使用这个类的方法
-
重点单词
file:文件 directory:文件夹/目录 path:路径
File类的静态成员方法 -File调用
- static String pathSeparator
与系统有关的路径分隔符,打印是一个分号。 Linux(😃
String pathSeparator = File.pathSeparator;
System.out.println(pathSeparator); //;
-
static char pathSeparatorChar
与系统有关的路径分隔符。 -
static String separator
与系统有关的默认名称分隔,打印是windows反斜杠。Linux(/)
String separator = File.separator;
System.out.println(separator); // \
- static char separatorChar
与系统有关的默认名称分隔符。- 注:操作路径不能写死,因为程序可能不是在Windows下
eg: D:\vs2019\TS改为
"D:"+File.separator+"vs2019"+File.separator+TS"
File类构造方法
- File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。- File parent优点:路径是File类型,可以对路径进行操作,再创建对象
public static void show02(){
File parent = new File("D:\\");
File file = new File(parent.getParent(), "b.txt");
- File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。- String name:字符串的路径名称
1.路径可以是文件结尾/也可以文件夹结尾
2.可以是相对/绝对路径
3.路径可以是存在的,可以是不存在的
注:创建File对象,只是把字符串路径封装为File对象,不考虑路径真假
- String name:字符串的路径名称
public static void show01(){
File file = new File("D:\\vs2019\\TS\\a.txt");
//重写了toString方法
System.out.println(file); //D:\vs2019\TS\a.txt
}
-
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。- 把路径分为两部分,使用灵活
String parent:eg: "c:\\"-灵活修改
String child:eg: "a.txt" -灵活修改
- 把路径分为两部分,使用灵活
-
File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
常用方法 - File对象调用
创建/删除文件或文件夹
- public boolean createNewFile()
由File对象调用创建,创建的是生成对象时,构造方法里的路径文件,可以是相对路径
创建成功:true
创建失败:false只能创建文件,不可创建文件夹,若书写有误,默认txt类型
文件的路径必须存在,否则抛出异常
//由于方法声明抛出异常,在写程序时,就会把异常扔回调用者,我们必须处理
public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
if (security != null) security.checkWrite(path);
if (isInvalid()) {
throw new IOException("Invalid file path");
}
return fs.createFileExclusively(path);
}
private static void show01() {
//报错
//File file = new File("D:\\vs2019\\TS");
//file.createNewFile();
//创建成功,注意用于有无权限访问文件夹
File file = new File("D:\\a.txt");
try {
System.out.println(file.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
}
- public boolean mkdir()
创建单级文件夹,由File生成对象时,构造方法的参数创建
private static void show01() {
File file = new File("文件夹1\\子文件夹");
System.out.println(file.mkdir());//false
//File file = new File("文件夹1");
// System.out.println(file.mkdir()); true
}
}
- public boolean mkdirs()
创建多级文件夹,也可以时单级的,绝对/相对都可以
private static void show01() {
File file = new File("文件夹1\\子文件夹");
System.out.println(file.mkdirs()); //true
}
//如果书写错误,还是创建的文件
}
- public boolean delete()
删除构造方法给出的文件/文件夹
false:文件夹里有内容,构造方法的参数路径不存在
注:直接在硬盘删除,不走回收站
获取功能的方法
- public String getAbsolutePath()
获取构造方法中的绝对路径
private static void show01() {
File file = new File("D:\\vs2019\\TS");
String file1 = file.getAbsolutePath();
System.out.println(file); //D:\vs2019\TS
File file0 = new File("a.txt");
String file02 = file0.getAbsolutePath();
//当前写程序的相对文件下的,绝对路径
System.out.println(file02); //C:\Users\Administrator\Desktop\java_code\a.txt
//实际也可以写(file2.toString()),底部调用的是getPath()
}
-
public String getPath()
与上面不同,获取构造方法的路径,是什么就是什么
-
public String getName()
获取构造方法中的结尾文件/或者文件夹
-
public long length()
获取的是构造方法指定的文件大小,以字节为单位Byte
注:返回0 的情况 - 文件夹是没有大小单位的,路径不存在
判断功能方法
- public boolean exists()
File对象调用,文件/目录存在返回True。否则false
也可以判断相对路径下的文件 - public boolean isDirectory()
判断构造方法中给的路径是否以文件夹结尾
- public boolean isFile
判断构造方法中给的路径是否以文件结尾
注:前提需要路径存在
File类遍历文件/文件夹的功能
- public String[] list()
用于遍历构造方法中的路径,返回的时一个包含目录中所有子目录与文件的字符串数组,但仅限当前目录下,不会向下递归
private static void show01() {
File file = new File("C:\\Users\\Administrator\\Desktop\\java_code");
String[] list = file.list();
for(String str : list) {
System.out.println(str);
}
}
/*
.idea
.vscode
demo01
demo02
demo03
*/
递归遍历子目录/子文件
package DiGui;
import java.io.File;
public class DiGui {
public static void main(String[] args) {
File dir = new File("C:\\Users\\Administrator\\Desktop\\java_code");
showFile(dir);
}
public static void showFile(File dir) {
//得到dir的子 文件/目录
File[] list = dir.listFiles();
System.out.println(dir.getAbsolutePath());
// 遍历该 目录/文件
for (File path : list) {
//如果是目录递归打印
if (path.isDirectory()) {
showFile(path);
} else {
System.out.println(path.getAbsolutePath());
}
}
}
}
递归遍历指定文件,完成指定文件搜索
public static void showFile(File dir) {
//得到dir的子 文件/目录
File[] list = dir.listFiles();
// 遍历该 目录/文件
for (File path : list) {
//如果是目录递归打印
if (path.isDirectory()) {
showFile(path);
} else {
/*
将path转化为字符串
1.path.getName();
2.path.getPath(); == path.toString();
*/
//调用字符串的方法,优化判断后缀名,判断结尾后缀名
if (path.getName().toLowerCase().endsWith(".md")) {
System.out.println(path.getAbsolutePath() + "\n找到了");
}
}
}
}
- public File[] listFiles()
同上,不过返回的是File数组,将文件/文件夹路径封装为File对象
private static void show01() {
File file = new File("C:\\Users\\Administrator\\Desktop\\java_code");
File[] list = file.listFiles();
for(File str : list) {
System.out.println(str);
}
}
/*
C:\Users\Administrator\Desktop\java_code\.idea
C:\Users\Administrator\Desktop\java_code\.vscode
C:\Users\Administrator\Desktop\java_code\demo01
C:\Users\Administrator\Desktop\java_code\demo02
C:\Users\Administrator\Desktop\java_code\demo03
*/
- 注:list()与listFiles方法遍历的是构造方法的参数目录,若不存在,抛出空指针异常,如果构造方法中给的不是目录也会抛出空指针异常
过滤器
-
在File类中有两个ListFiles的两个重载方法,方法的传递参数就是过滤器
-
File[] listFiles(FileFilter filter)
返回抽象路径名数组,java.io.FileFilter接口,用于抽象路径名(File的对象)的过滤器(Filter)作用:用来过滤文件(File对象)
抽象方法: boolean accept(File pathname)
测试指定抽象路径名是否应该包含在某个路径名列表中。
File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
-
public static void showFile(File dir) {
//匿名内部类重写过滤器抽象方法,多态,使用过滤器来过滤不想要的
File[] list = dir.listFiles(new FileFilter() {
/*
过滤机制:上述listFiles做了如下几件事
1. listFiles会获取dir目录中的每一个文件/文件夹——>封装为File对象
2. listFiles方法会调用参数传递过滤器中的方法accept
3. listFiles方法会把遍历的每一个对象给accept方法的pathName,因此可以用以下方法进行过滤
4. 但由于返回值是布尔值,若是True,就会把传递进来的对象保存回File数组中,若是false,不保存
*/
@Override
public boolean accept(File pathname) {
if (pathname.getName().toLowerCase().endsWith(".md")){
return true;
}
else {
//如果是文件夹递归,否则不存
if (pathname.isDirectory()){
showFile(pathname);
return false;
}else
return false;
}
}
});
//打印文件.md路径
for (File fileName: list) {
System.out.println(fileName.getAbsolutePath());
}
}
}
//另一种写法,但是File[]存在有所有文件/目录,当然也可以用lambda
public static void showFile(File dir) {
//匿名内部类重写过滤器抽象方法,使用过滤器来过滤不想要的
File[] list = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//返回后缀为.md的文件,endWith返回的是布尔值,若是文件也放进去,用于下面方法的递归
return pathname.getName().endsWith(".md") || pathname.isDirectory();
}
});
//打印文件.md路径
for (File fileName : list) {
if (fileName.isDirectory()){
showFile(fileName);
}else
System.out.println(fileName.getAbsolutePath());
}
}
2. File[] listFiles(FileNameFilter filter)
返回抽象路径名数组,java.io.FileNameFilter接口,实现该接口的实例可用于过滤文件名, 【比1方便】
>作用:用于过滤文件名称
>抽象方法: boolean accept(File dir, String name)
>dir:构造方法中被遍历的目录
>name :使用ListFiles的方法遍历得到的,文件/文件夹名称
package DiGui;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class DiGui {
public static void main(String[] args) {
File dir = new File("C:\\Users\\Administrator\\Desktop\\java_code");
showFile(dir);
}
public static void showFile(File dir) {
/* //lambda表达式
File[] list = dir.listFiles((File pathname,String pathStr)-> {
//返回后缀为.md的文件,endWith返回的是布尔值,若是文件也放进去,用于下面方法的递归
return pathStr.toLowerCase().endsWith(".md") || new File(pathname,pathStr).isDirectory();
});*/
File[] list = dir.listFiles((pathname,pathStr)-> pathStr.toLowerCase().endsWith(".md") || new File(pathname,pathStr).isDirectory());
//打印文件.md路径
for (File fileName : list) {
if (fileName.isDirectory()){
showFile(fileName);
}else
System.out.println(fileName.getAbsolutePath());
}
}
}