1. File类
1.1 概述
java.io包中提供了一个File
类,该类用于表示系统中文件或者目录,使用File类可以对文件或者目录结构进行操作,即使用java.io.File
类提供的构造方法和普通方法可以对文件(标准文件,目录)进行:创建,删除,扫描,等操作
1.2. 构造方法
File(String path)
File(String parent,String child)
File(File parent,String child)
//使用提供的文件(或目录)路径
File f = new File("D:/素材/视频/短视频/大事发生.mp4");
System.out.println(f.toString());
f = new File("D:/素材/视频/短视频","大事发生.mp4");
System.out.println(f);
f = new File(new File("D:/素材/视频/短视频"),"大事发生.mp4");
System.out.println(f);
1.3. 常见方法
createNewFile()
:创建由当前File对象所表示的新文件(标准文件)mkdir()
:创建由当前File对象所表示的目录(一级子目录)mkdirs()
:创建由当前File对象所表示的目录(多级子目录)delete()
:删除当前File所表示的文件或者目录(空目录)exists()
:判断当前File表示的文件或目录是否存在getAbsolutePath()
:获取当前File对象的绝对路径getName()
:获取当前文件名getParentFile()
:获取当前RFile所表示的父文件对象isDirectory()
:判断当前File对象所表示的是否是一个目录isFile()
:判断当前File对象所表示的是否是一个标准文件length()
:获取File对象表示的文件大小(字节),若目录返回0lastModified()
:获取File对象表示文件的最后修改时间(毫秒:从1970.01.01 00:00:00到最后修改时间)list()
:返回当前File对象所表示目录中的所有子文件或子目录名称数组(String数组)listFiles()
:返回当前File对象所表示目录中的所有子文件或子目录对象(File数组)listFiles(FileFilter filter)
:使用指定的过滤规则,返回当前File对象所表示目录中的所有子文件或子目录对象(File数组)listRoots()
:返回当前系统的所有盘符数组renameTo(File file)
:重命名文件
//获取与系统有关的路径分隔符 window-";" linux-":"
System.out.println(File.pathSeparatorChar);
//获取与系统有关的名称分隔符 window-"\" linux="/"
System.out.println(File.separatorChar);
//使用提供的文件(或目录)路径
File f = new File("D:/素材/视频/短视频/大事发生.mp4");
System.out.println(f.toString());
f = new File("D:/素材/视频/短视频","大事发生.mp4");
System.out.println(f);
f = new File(new File("D:/素材/视频/短视频"),"大事发生.mp4");
System.out.println(f);
System.out.println(f.canExecute());
System.out.println(f.canRead());
System.out.println(f.canWrite());
f = new File("D:/素材/视频/短视频/小电影/mp4/xx/私密");
//创建当前File对象所表示的新文件
// System.out.println("文件创建结果:"+f.createNewFile());
//创建目录,创建一级子目录
// System.out.println("目录创建结果:"+f.mkdir());
//创建目录,创建多级子目录(包括不存在的父目录)
System.out.println("目录创建结果:"+f.mkdirs());
//在指定的目录中创建指定前缀和后缀的临时文件
File tempFile = File.createTempFile("test",".log",new File("D:/素材/视频/短视频"));
// new Timer().schedule(new TimerTask() {
// @Override
// public void run() {
// if(tempFile.delete()){
// System.out.println("删除成功");
// }else{
// System.out.println("删除失败");
// }
// }
// },5000);
// System.out.println(f);
//在JVM结束时删除文件
tempFile.deleteOnExit();
f = new File("D:\\素材\\视频\\短视频\\小电影\\mp4\\xx\\私密");
//删除由File所表示的标准文件或者目录(空目录)
System.out.println("删除目录:"+f.delete());
//判断由File所表示的标准文件或者目录是否存在
System.out.println(f.getParentFile().exists());
//获取由该File对象所表示的文件或目录的绝对路径
System.out.println("绝对路径:"+f.getAbsolutePath());
System.out.println("绝对路径表示的文件对象"+f.getAbsoluteFile());
//获取当前文件或目录所表示磁盘的剩余空间(字节)
//1024字节=1KB 1024kb=1MB 1024MB=1GB 1024GB=1TB 1024TB=1PB
System.out.println("当前盘符剩余空间:"+f.getParentFile().getFreeSpace()+"字节");
System.out.println((f.getParentFile().getFreeSpace() / (1024 * 1024 * 1024)));
System.out.println("当前盘符的总空间:"+f.getParentFile().getTotalSpace()+"字节");
f = new File("D:/素材/视频/短视频/大事发生.mp4");
//获取文件名称
System.out.println("文件名:"+f.getName());
System.out.println("父路径:"+f.getParent());
System.out.println("父路径所表示的文件:"+f.getParentFile());
System.out.println("判断File对象是否是目录:"+f.isDirectory());
System.out.println("判断File对象是否是标准文件:"+f.isFile());
f = new File("D:\\素材\\视频\\预告片\\猫和老鼠.mp4");
System.out.println(f.exists());
System.out.println("判断当前文件对象是否是隐藏文件:"+f.isHidden());
//获取当前文件的最后修改时间
long time = f.lastModified();
System.out.println(new Date(time));
//获取目标File对象所表示文件的大小(字节)
long len = f.length();
System.out.println(len / (1024*1024.0));
1.4. 文件过滤
在一些项目的需求中,可能会涉及到对文件的筛选,常规的做法如下:
File file = new File("D:\\素材\\音乐\\music素材");
File[] files = file.listFiles();
for (File f : files) {
if (f.getName().endsWith(".mp3")) {
System.out.println(f.length() + "------" + f.getName());
}
}
以上方式采用普通的条件判断对文件进行筛选;对于File类,JDK还提供了一个用于文件过滤的方法:listFile(FileFilter filter)
,其中FileFilter
是JDK1.2新增的一个用于实现过滤规则的接口,源码如下:
public interface FileFilter {
boolean accept(File pathname);
}
在listFile(FileFilter filter)
方法中实现源代码如下:
public File[] listFiles(FileFilter filter) {
//获取当前File对象下所有的子文件和子目录名称
String ss[] = list();
if (ss == null) return null;
//创建新集合用于存储过滤之后的文件
ArrayList<File> files = new ArrayList<>();
//对所有的子文件和子目录名遍历
for (String s : ss) {
//根据提供的文件名和当前目录对象构建新的File(需要被筛选的File)
File f = new File(s, this);
//判断是否有提供过滤器,若未提供则不执行过滤,即:将文件直接放行
//然后调用被调用方实现的FileFilter中的accept方法执行过滤
if ((filter == null) || filter.accept(f))
//将符合条件的文件对象加入集合中
files.add(f);
}
//将集合对象转换为File数组返回
return files.toArray(new File[files.size()]);
}
在客户端中使用listFile(FileFilter filter)
执行过滤:
File file = new File("D:\\素材\\音乐\\music素材");
File[] list = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".jpg");
}
});
for (File f : list) {
System.out.println(f.getName());
}
文件过滤器实现原理:
1.5. 递归读取文件夹
public class FileDemo5 {
public void readDir(File dir){
//读取目录下的所有子文件对象
File[] files = dir.listFiles();
if(Objects.nonNull(files)){
for(File f:files){
System.out.println(f.getAbsolutePath());
if(f.isDirectory()){
//递归读取
readDir(f);
}
}
}
}
public static void main(String[] args) {
File file = new File("D:\\素材\\视频");
new FileDemo5().readDir(file);
}
}