File类 简介
在java中,File类是java.io包中唯一代表磁盘(文件系统) 文件本身的对象(实际上表示的是一个抽象路径) 。File类定义了一些与平台无关的方法来操作文件,File类主要是用来获取或是处理与磁盘文件相关的信息。
File 类表示处理文件和文件系统的相关信息。也就是说,File 类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性。
- 使用File可以做到:
- 访问其表示的文件或文件夹的属性信息 例如:文件名、 文件大小、文件路径、访问权限和修改日期等...
- 创建和删除文件或文件夹
- 访问 \ 浏览一个文件夹的子项
File类的相关方法
1、构造方法
- File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File实例。
- File(String parent, String child) 根据指定的父路径和文件路径创建一个新File对象实例。
- File(File parent, String child) 根据指定的父路径对象和文件路径创建一个新的 File 对象实例。
代码实现过程:
package test;
import java.io.File;
public class Test {
public static void main(String[] args) {
/*
实际开发中我们不会使用绝对路径。虽然清晰明了,但是不利于跨平台。
相对路径有更好的跨平台性,但是具体位置要看程序运行环境而定。
例如:
"./":当前目录,对于IDEA而言,该目录是当前程序所在的项目目录。
*/
//File(String pathname) 将指定路径名转换成一个File对象
File file = new File("./demo.txt");
System.out.println(file);
//File(String parent,String child) 根据指定的父路径和文件路径创建File对象
File file1 = new File("./","demo1.txt");
System.out.println(file1);
//File(File parent,String child) 根据指定的父路径对象和文件路径创建File对象
File parent = new File("./");
File file2 = new File(parent, "demo2.txt");
System.out.println(file2);
File file3 = new File(new File("./"),"demo3.txt");
System.out.println(file3);
}
}
运行结果:
2、File类创建和删除功能
- boolean createNewFile(); 指定路径不存在该文件时创建文件 返回true 否则false
- boolean mkdir(); 当指定的文件夹不存在时创建当前文件夹 返回true 否则false
- boolean mkdirs(); 会一同将不存在的父目录全部创建出来 返回true 否则false
- boolean delete(); 删除文件或为空的目录,当目录非空时无法删除 返回true 否则false
package file; import java.io.File; import java.io.IOException; /** * 使用File创建一个新文件 * boolean createNewFile();指定路径不存在该文件时创建文件 返回true 否则false * create:创建 * New:新的 * File:文件 */ public class CreateNewFileDemo { public static void main(String[] args) throws IOException { //在当前目录下新建一个文件:test.txt File file = new File("./test.txt"); //boolean exists()判断当前File表示的位置是否已经实际存在该文件或目录 if(!file.exists()){ file.createNewFile();//将File表示的文件创建出来 } } }
package file; import java.io.File; /** * 使用File创建目录 * boolean mkdir(); 当指定的文件夹不存在时创建当前文件夹 返回true 否则false */ public class MkDirDemo { public static void main(String[] args) { //在当前目录下新建一个目录:demo File dir = new File("a/demo"); if(!dir.exists()){ dir.mkdir();//创建File表示的目录时要求所在的目录(a目录)必须存在 } } }
package file; import java.io.File; /** * 使用File创建应该目录 * boolean mkdirs(); 会一同将不存在的父目录全部创建出来 返回true 否则false */ public class MkDirsDemo { public static void main(String[] args) { //在当前目录下新建一个目录:a/b/c/d/e/f/demo File file = new File("a/b/c/d/e/f/demo"); if (!file.exists()){ file.mkdirs();//会一同将不存在的父目录全部创建出来 } } }
direction:目录 make:制造 注:mkdir是linux中的一条命令。就是make direcory的简写,意思是创建目录
package file; import java.io.File; /** * 删除一个文件夹\文件 * boolean delete(); 删除文件或者删除单级文件夹(只能删除空目录) */ public class DeleteDemo { public static void main(String[] args) { File file = new File("./demo"); if (file.exists()){ file.delete();//将该文件夹\文件删除 } } }
2、File类判断功能
- boolean exists(); 判断文件或目录是否存在。
- boolean isDirectory(); 判断是否是目录。
- boolean isFile(); 判断是否是文件。
- boolean isHidden(); 判断是否是一个隐藏文件。
- boolean isAbsolute(); 判断当前路径是否是绝对路径。
package file; import java.io.File; import java.io.IOException; /** * File类判断功能 */ public class FileDemo{ public static void main(String[] args) throws IOException { method1();//判断文件或文件夹是否存在 method2();//判断是否是目录 判断是否是文件 method3();//判断是否是一个隐藏文件 method4();//判断当前路径是否是绝对路径 } //exists();判断文件或文件夹是否存在 public static void method1() throws IOException { File file = new File("a.txt"); file.createNewFile(); boolean flag = file.exists(); System.out.println("exists():"+flag); } //isDirectory();判断是否是目录 isFile();判断是否是文件。 public static void method2() throws IOException{ File file = new File("./b.txt");//在当前项目中没有创建该文件 File file1 = new File("./c");//提示:在当前项目中没有创建该文件夹 file1.mkdir(); boolean flag = file.isDirectory(); boolean flag2 = file1.isFile(); System.out.println("isDirectory():"+flag); System.out.println("isFile():"+flag2); } //isHidden();判断是否是一个隐藏文件 public static void method3() throws IOException{ File file = new File("a.txt"); System.out.println("isHidden():"+file.isHidden()); } //isAbsolute();判断当前路径是否是绝对路径 public static void method4() throws IOException{ // File file = new File("./a1.txt");//相对路径 File file = new File("D:\\a\\demo.txt");//绝对路径 boolean flag = file.isAbsolute(); System.out.println("isAbsolute():"+flag); } }
3、File中的常用方法:
- String getName(); 获取文件或目录(文件夹)的名称。
- long length(); 获取当前文件大小(长度)。
- long lastModified() 以毫秒值返回最后修改时间。
- boolean renameTo(); 将当前File对象所指向的路径修改为指定File所指向的路径(重命名)。
- boolean canRead(); 判断文件或目录是否可读。
- boolean canWrite(); 判断文件或目录是否可写。
- String Path(); 获取文件或目录的路径。
- String getParent(); 获取当前文件或目录的父级文件的路径,以字符串的形式返回该父级路径,没有则返回null。
- String getparentFile(); 获取文件或目录的父级文件,如果给定的抽象路径没有父目录,则返回null。
- Strin[] list(); 获取目录中的文件及目录,返回名称数组。
- File[] listFiles(); 获取目录中的文件及目录,返回文件数组(以File对象的形式)。
- Static File[] listRoots() 获取计算机中的所有盘符
4、FileFilter文件过滤器:
java.io.FileFilter接口:用于抽象路径(File对象)的过滤器
作用:
用于过滤File文件名
FileFilter接口里唯一的抽象方法:boolean accept(File pathname) :测试 pathname(指定的抽象路径名) 是否应该包含在路径名列表中。
参数:
使用ListFiles方法遍历目录后 得到的每一个文件对象(pathname - 要测试的抽象路径名)
注:这两个过滤器接口没有实现类
须自己写实现类 然后重写过滤的方法(accept()) 在方法中自己定义过滤的规则
1、listFiles()方法会对构造方法中传递的目录进行遍历
并获取目录中的每一个文件或文件夹 然后封装成File对象
2、listFiles()方法会调用传递进来的过滤器中的accept()方法
3、listFiles()方法会将遍历得到的每一个File对象传递给accept()方法的pathname参数
accept()方法返回的是一个布尔值:
true:将传递过去的File对象保存到File数组中(放行)
false:不将传递过去的File对象保存到File数组中
定义一个类实现FileFilter接口的方式:
package demo;
import java.io.File;
import java.io.FileFilter;
/**
* 重载的listFiles方法,允许我们传入一个文件过滤器从而可以有条件的获取一个目录
* 中的子项。
*/
public class Test {
public static void main(String[] args) {
/* 需求:获取当前目录中所有名字以"."开始的子项 */
File file = new File("./");
File[] files = file.listFiles(new FileFilterImpl());
for (File file2 : files) {
System.out.println(file2);
}
}
}
class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File f) {
String name = f.getName();
boolean starts = name.startsWith(".");//名字是否以"."开始
System.out.println("过滤器过滤:"+name+",是否符合要求:"+starts);
return starts;
}
}
匿名内部类的方式:
package demo;
import java.io.File;
import java.io.FileFilter;
public class Test {
public static void main(String[] args) {
File file = new File("./");
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String name = pathname.getName();
boolean starts = name.startsWith(".");//判断名字是否以"."开始
System.out.println("过滤器过滤:"+name+",是否符合要求:"+starts );
return starts ;
// return pathname.getName().startsWith(".");//判断名字是否以"."开始
}
});
}
}
Lambda表达式:
package demo;
import java.io.File;
import java.io.FileFilter;
/**
* JDK8之后java支持了lambda表达式这个特性
* lambda表达式可以用更精简的语法创建匿名内部类,但是实现的接口只能有一个抽象
* 方法,否则无法使用。
* lambda表达式是编译器认可的,最终会被改为内部类形式编译到class文件中。
*
* 语法:
* (参数列表)->{
* 方法体
* }
*/
public class Test {
public static void main(String[] args) {
File file = new File("./");
//匿名内部类形式创建FileFilter
FileFilter filter = new FileFilter() {
public boolean accept(File file) {
return file.getName().contains(".");
}
};
//lambda表达式写法(就是省去了接口名和方法名)
FileFilter filter1 = (File f)->{
return f.getName().contains(".");
};
//参数类型可以忽略不写,如果只有一个参数时,参数列表的"()"可以忽略不写
FileFilter filter2 = f->{
return f.getName().contains(".");
};
//当方法体中只含有一句话时,方法体的"{}"可以忽略,并且如果含有return时要一同忽略
FileFilter filter3 = f->f.getName().contains(".");
//遍历
File[] files = file.listFiles(filter);
for (File f : files
) {
System.out.println("过滤器过滤:"+f.getName()+",是符合要求");
}
}
}
递归删除子文件:
package demo;
import java.io.File;
/**
* 递归删除子文件
*/
public class Test {
public static void main(String[] args) {
deleteFile("./a");
}
public static void deleteFile(String path) {
File file = new File(path);
if (file.exists()) {
if (file.isDirectory()) {
File[] temp = file.listFiles(); //获取该文件夹下的所有文件
for (File value : temp) {
deleteFile(value.getAbsolutePath());
}
} else {
file.delete(); //删除子文件
}
file.delete(); //删除文件夹
}
}
}