文章目录
一、File类概述
File类是java.io包中唯一代表磁盘文件本身的对象。 以抽象的方式代表文件名和目录路径名。
可以通过File类中的方法来操作文件,如新建、删除、重命名文件和目录等。
File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。
File对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。
File类实现了Compareable和Serializable接口,可以比较或者实现序列化。
二、File类方法
2.1File类的构造方法
构造方法 | 说明 |
---|---|
File(String pathname) | 如果 pathname是实际存在的路径,则该 File 对象表示的是目录;如果 pathname是文件名,则该 File 对象表示的是文件。 |
File(String parent, String child) | parent为父路径,child为子路径创建File对象。 |
File(File parent, String name) | dir 是路径对象,name 是文件名。 |
File(URI uri) | 通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。 |
@Test
public void fileConstructTest() throws URISyntaxException {
//构造器1`File(String pathname)`
File file1 = new File("hello1.txt");
File file4 = new File("E:\\java"+File.separator+"hello1.txt");
//构造器2 File(String parent, String child)`
File file2 = new File("E:\\java","hello2.txt");
//构造器3 File(File parent, String name)`
File file3 = new File(file2, "hello3.txt");
System.out.println(file1);//hello1.txt
System.out.println(file4);//E:\java\hello1.txt
System.out.println(file2);//E:\java\hello2.txt
System.out.println(file3);//E:\java\hello2.txt\hello3.txt
}
2.2File类的静态成员变量
静态成员变量 | 描述 |
---|---|
public static String pathSeparator | 系统中多个路径的分隔符 windows下是:; |
public static String separator | 系统中一个路径中多个名称之间的分隔符号 windows下是:\ |
File file4 = new File("E:\\java"+File.separator+"hello1.txt");
2.3File的常用方法
使用任意一个构造方法都可以创建一个 File 对象,然后调用其提供的方法对文件进行操作。
判断方法 | 说明 |
---|---|
boolean canRead() | 判断是否可读的文件 |
boolean canWrite() | 判断是否可写的文件 |
boolean isDirectory() | 判断当前 File 对象表示的文件是否为一个路径(目录) |
boolean isFile() | 判断当前 File 对象表示的文件是否为一个“普通”文件 |
boolean exists() | 判断当前 File 是否存在 |
boolean isHidden() | 判断是否隐藏 |
boolean isAbsolute() | 判断当前 File 对象表示的文件是否为一个绝对路径名。该方法消除了不同平台的差异,可以直接判断 file 对象是否为绝对路径。在 UNIX/Linux/BSD 等系统上,如果路径名开头是一条斜线/ ,则表明该 File 对象对应一个绝对路径;在 Windows 等系统上,如果路径开头是盘符,则说明它是一个绝对路径。 |
获取方法 | 说明 |
String getAbsolutePath() | 返回由该对象表示的文件的绝对路径名 |
String getName() | 返回表示当前对象的文件名或路径名(如果是路径,则返回最后一级子路径名) |
String getParent() | 返回当前 File 对象所对应目录(最后一级子目录)的父目录名 |
long lastModified() | 返回当前 File 对象表示的文件最后修改的时间 |
long length() | 返回当前 File 对象表示的文件长度 |
String[] list() | 返回当前 File 对象指定的路径文件列表 |
String[] list(FilenameFilter) | 返回当前 File 对象指定的目录中满足指定过滤器的文件列表 |
删除方法 | 说明 |
boolean delete() | 删除当前对象指定的文件 |
创建方法 | 说明 |
public boolean createNewFile() | 创建文件。若文件存在,则不创建,返回false |
boolean mkdir() | 创建一级目录,它的路径名由当前 File 对象指定 |
boolean mkdirs() | 创建多级目录,它的路径名由当前 File 对象指定 |
重命名方法 | 说明 |
boolean renameTo(File) | 将当前 File 对象指定的文件更名为给定参数 File 指定的路径名 |
三、File类的使用案例
3.1递归搜索文件
根据文件名称进行搜索。
@Test
public void findByNameTest(){
String filePath = "E:"+File.separator+"java";
String fileName = "File类";
File file = new File(filePath);
String fi = findByName(file, fileName);
System.out.println(fi);
}
public static String findByName(File file,String fileName){
File[] files = file.listFiles();
//没有文件则返回
if (files == null || files.length == 0) {
return "目录无文件或目录名不存在!";
}
for (File f : files) {
if (f.isDirectory()){
//递归查找
findByName(f,fileName);
}else {
String name = f.getName();
if (name.contains(fileName)){
return f.getAbsolutePath();
}
}
}
return "当前目录下找不到目标文件!";
}
可以在此基本上进行扩展,例如文件的复制、移动、删除、求大小等操作。
3.2统计文件夹大小
@Test
public void calculateDirSizeTest(){
String filePath = "E:"+File.separator+"java";
String fileName = "File类";
File file = new File(filePath);
long size = calculateDirSize(file);
System.out.println("文件夹大小:"+size + "字节");
}
public static long calculateDirSize(File srcDir) {
long size = 0;
File[] files = srcDir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
size += calculateDirSize(file);
} else {
size += file.length();
}
}
return size;
}
3.3文件过滤器
要从列表中排除扩展名为.SYS的所有文件,我们可以使用由功能接口FileFilter的实例表示的文件过滤器来实现。
它包含一个accept()方法,它将File作为参数列出,如果应该列出文件,则返回true。返回false不会列出文件。
FileFilter filter = file -> {
if (file.isFile()) {
String fileName = file.getName().toLowerCase();
if (fileName.endsWith(".sys")) {
return false;
}
}
return true;
};