File类
java.io.File
-
File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)
-
并没有直接提供移动/复制文件的方法,需要自己手动编写或者直接使用Files 文件工具类
-
File不能访问文件数据
-
实现了比较器-Comparable接口和Comparator接口和序列化的接口
File类属性
-
属性名
File.separator
:根据当前系统返回一个路径的分隔符
-
示例代码
System.out.println(File.separator);// \
File类常用方法
- 列举了45个左右的方法
创建操作
-
方法名
-
boolean createNewFile():
当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。-
返回的是创建是否成功。临时文件已存在返回则创建失败,返回false。不存在则创建成功返回true
-
注意:最后一级目录是临时文件的名称
-
-
static File createTempFile(String prefix, String suffix):
在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。-
默认路径:
C:\Users\用户名\AppData\Local\Temp
-
注意:前缀名称的长度必须
大于3
;如果后缀为null,默认为.tmp
-
创建效果
-
-
static File createTempFile(String prefix, String suffix, File directory):
在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。- 创建效果
- 创建效果
-
boolean mkdir():
创建由此抽象路径名命名的目录。-
只能创建一级目录,如果传入的是多级目录,则会创建失败;
-
如果目录已存在,也会返回false
-
-
boolean mkdirs():
创建由此抽象路径名命名的目录-
多层目录会级联创建;不会覆盖原有的目录
-
创建效果
-
-
-
示例代码
// 创建操作 { File file1 = new File("./file/这是文件名"); // boolean createNewFile():当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。【最后一级目录是临时文件的名称】 try { boolean newFile = file1.createNewFile(); //创建临时文件是否成功:true System.out.println("创建临时文件是否成功:" + newFile); } catch (IOException e) { e.printStackTrace(); } // static File createTempFile(String prefix, String suffix):在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。 try { File tempFile = File.createTempFile("这是前缀", ".后缀"); //C:\Users\Administrator\AppData\Local\Temp\这是前缀6145411571022854136.后缀 System.out.println(tempFile); } catch (IOException e) { e.printStackTrace(); } // static File createTempFile(String prefix, String suffix, File directory):在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 File file3 = new File("./file/temp");//指定存放临时文件的地址 try { File temp = File.createTempFile("临时文件名的前缀", ".temp", file3); // .\file\temp\临时文件名的前缀2536301214503247272.temp System.out.println(temp); } catch (IOException e) { e.printStackTrace(); } // boolean mkdir():创建由此抽象路径名命名的目录。 File file4 = new File("./file/a"); boolean mkdir = file4.mkdir(); //创建一层目录的结果:true System.out.println("创建一层目录的结果:" + mkdir); // boolean mkdirs():创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 File file5 = new File("./file/a/b/c/d/e/f"); boolean mkdirs = file5.mkdirs(); //创建多层目录的结果:true System.out.println("创建多层目录的结果:" + mkdirs); }
删除操作
-
方法名
-
boolean delete():
删除由此抽象路径名表示的文件或目录。-
如果此路径名表示目录,则目录必须为空才能删除。
-
删除后不进入回收站
-
-
void deleteOnExit():
请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。
-
-
示例代码
// 删除操作 { // boolean delete():删除由此抽象路径名表示的文件或目录。 File file1 = new File("./file/a.txt"); boolean delete = file1.delete(); System.out.println("删除结果:" + delete); // void deleteOnExit():请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。 File file2 = new File("./file/b.txt"); file2.deleteOnExit(); }
更新操作
-
方法名
-
boolean renameTo(File dest):
重命名由此抽象路径名表示的文件。- 如果新的File对象指定的是新路径,那么相当于对文件进行移动。路径不存在则失败,不加路径默认到项目根目录。
-
boolean setExecutable(boolean executable):
为此抽象路径名设置所有者的执行权限的便利方法。 -
boolean setExecutable(boolean executable, boolean ownerOnly):
设置该抽象路径名的所有者或每个人的执行权限。 -
boolean setLastModified(long time):
设置由此抽象路径名命名的文件或目录的最后修改时间。 -
boolean setReadable(boolean readable):
一种方便的方法来设置所有者对此抽象路径名的读取权限。 -
boolean setReadable(boolean readable, boolean ownerOnly):
设置此抽象路径名的所有者或每个人的读取权限。 -
boolean setReadOnly():
标记由此抽象路径名命名的文件或目录,以便只允许读取操作。 -
boolean setWritable(boolean writable):
一种方便的方法来设置所有者对此抽象路径名的写入权限。- 相当于控制是否只读
-
boolean setWritable(boolean writable, boolean ownerOnly):
设置此抽象路径名的所有者或每个人的写入权限。
-
-
示例代码
// 更新操作 { // boolean renameTo(File dest):重命名由此抽象路径名表示的文件。 File file1 = new File("./file/aaa.txt"); File fileByRename = new File("./file/temp/bbb.txt"); boolean b1 = file1.renameTo(fileByRename); System.out.println("重命名文件结果:" + b1); // boolean setLastModified(long time):设置由此抽象路径名命名的文件或目录的最后修改时间。 File file2 = new File("./file/time.txt"); LocalDateTime dateTime = LocalDateTime.of(1990, 1, 1, 6, 6); long l = dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli(); boolean b2 = file2.setLastModified(l); System.out.println("更新文件最后一次修改时间为:" + dateTime + ",是否成功:" + b2); // boolean setExecutable(boolean executable):为此抽象路径名设置所有者的执行权限的便利方法。 boolean b3 = file2.setExecutable(true); System.out.println("1-setExecutable():" + b3);//1-setExecutable():true // boolean setExecutable(boolean executable, boolean ownerOnly):设置该抽象路径名的所有者或每个人的执行权限。 boolean b4 = file2.setExecutable(true, true); System.out.println("2-setExecutable():" + b4);//2-setExecutable():true // boolean setReadable(boolean readable):一种方便的方法来设置所有者对此抽象路径名的读取权限。 // boolean setReadable(boolean readable, boolean ownerOnly):设置此抽象路径名的所有者或每个人的读取权限。 // boolean setReadOnly():标记由此抽象路径名命名的文件或目录,以便只允许读取操作。 boolean b5 = file2.setReadOnly(); System.out.println("设置文件只读:" + b5);//设置文件只读:true // boolean setWritable(boolean writable):一种方便的方法来设置所有者对此抽象路径名的写入权限。 File file3 = new File("./file/write.txt"); boolean b6 = file3.setWritable(false); System.out.println("设置写入权限操作结果:" + b6); // boolean setWritable(boolean writable, boolean ownerOnly):设置此抽象路径名的所有者或每个人的写入权限。 }
获取文件信息操作
-
方法名
-
long lastModified():
返回此抽象路径名表示的文件上次修改的时间。 -
long length():
返回由此抽象路径名表示的文件的长度。 -
Path toPath():
返回从此抽象路径构造的java.nio.file.Path对象。 -
URI toURI():
构造一个表示此抽象路径名的 file: URI。 -
boolean canExecute():
测试应用程序是否可以执行此抽象路径名表示的文件。 -
boolean canRead():
测试应用程序是否可以读取由此抽象路径名表示的文件。 -
boolean canWrite():
测试应用程序是否可以修改由此抽象路径名表示的文件。
-
-
示例代码
// 获取文件信息操作 { File movie = new File("G:\\DY电影\\亡命救护车.ts"); // long lastModified():返回此抽象路径名表示的文件上次修改的时间。 long lastModified = movie.lastModified(); LocalDateTime dateTime = Instant.ofEpochMilli(lastModified).atZone(ZoneId.systemDefault()).toLocalDateTime(); //上次修改的时间:2022-07-30 07:49:42 System.out.println("上次修改的时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss").format(dateTime)); // long length():返回由此抽象路径名表示的文件的长度。 long length = movie.length(); long kb = length / 1024; long mb = kb / 1024; long gb = mb / 1024; //文件长度:2449280732B --> 2391875KB --> 2335MB --> 2GB System.out.println("文件长度:" + length + "B --> " + kb + "KB --> " + mb + "MB --> " + gb + "GB"); // Path toPath():返回从此抽象路径构造的java.nio.file.Path对象。 Path path = movie.toPath(); //java.nio.file.Path:G:\DY电影\亡命救护车.ts System.out.println("java.nio.file.Path:" + path); // URI toURI():构造一个表示此抽象路径名的 file: URI。 URI uri = movie.toURI(); //uri:file:/G:/DY电影/亡命救护车.ts System.out.println("uri:" + uri); // boolean canExecute():测试应用程序是否可以执行此抽象路径名表示的文件。 boolean b1 = movie.canExecute(); System.out.println("canExecute():" + b1);//canExecute():true // boolean canRead():测试应用程序是否可以读取由此抽象路径名表示的文件。 boolean b2 = movie.canRead(); System.out.println("canRead():" + b2);//canRead():true // boolean canWrite():测试应用程序是否可以修改由此抽象路径名表示的文件。 boolean b3 = movie.canWrite(); System.out.println("canWrite():" + b3);//canWrite():true }
其他信息查询操作
-
方法名
-
long getFreeSpace():
返回分区未分配的字节数 。-
如果路径中写的文件、目录、盘符,有一个不存在都返回0
-
使用此方法加上循环,可以利用ASCII码查找出本地的盘符,不过本地盘符的空间必须>0,否则结果不准确。【也可以利用exists()方法判断盘符是否存在】
-
-
long getTotalSpace():
通过此抽象路径名返回分区 named的大小。 -
long getUsableSpace():
返回上的分区提供给该虚拟机的字节数 named此抽象路径名。 -
boolean isAbsolute():
测试这个抽象路径名是否是绝对的。
-
-
示例代码
// 其他信息查询操作 { File file1 = new File("G:\\DY电影\\亡命救护车.ts"); // long getFreeSpace():返回分区未分配的字节数 named此抽象路径名。 File file2 = new File("c:\\"); long freeSpace = file2.getFreeSpace(); //C盘剩余磁盘未分配的空间大小:92GB System.out.println("C盘剩余磁盘未分配的空间大小:" + (freeSpace / 1024 / 1024 / 1024) + "GB"); System.out.println("===== 遍历出本地的所有磁盘,并显示剩余空间 ====="); //遍历出本地的所有磁盘,并显示剩余空间 for (int i = 97; i <= (97 + 26); i++) { //根据盘符字母创建File对象 File f = new File((char) i + ":\\"); //如果盘符存在 if (f.exists()) { //获取总容量【转换成GB】 long totalSpace = f.getTotalSpace() / 1024 / 1024 / 1024; //获取剩余容量【转换成GB】 long freeSpace1 = f.getFreeSpace() / 1024 / 1024 / 1024; System.out.println((char) (i - 32) + "盘容量:" + freeSpace1 + "/" + totalSpace + "\t剩余可用容量:" + (totalSpace - freeSpace1) + "GB"); } } System.out.println(); // long getTotalSpace():通过此抽象路径名返回分区的总大小。 long totalSpace = file1.getTotalSpace(); //G盘总容量:300GB System.out.println("G盘总容量:" + (totalSpace / 1024 / 1024 / 1024) + "GB"); // long getUsableSpace():返回上的分区提供给该虚拟机的字节数。 long usableSpace = file1.getUsableSpace(); //G盘分区提供给该虚拟机的字节数:192GB System.out.println("G盘分区提供给该虚拟机的字节数:" + (usableSpace / 1024 / 1024 / 1024) + "GB"); // boolean isAbsolute():测试这个抽象路径名是否是绝对的。 boolean absolute = file1.isAbsolute(); //1-抽象路径名是否是绝对的:true System.out.println("1-抽象路径名是否是绝对的:" + absolute); //2-抽象路径名是否是绝对的:false System.out.println("2-抽象路径名是否是绝对的:" + new File("./file").isAbsolute()); }
判断本地有哪些盘符
-
使用ASCII码+循环
//遍历出本地的所有磁盘,并显示剩余空间 for (int i = 97; i <= (97 + 26); i++) { //根据盘符字母创建File对象 File f = new File((char) i + ":\\"); //如果盘符存在 if (f.exists()) { //获取总容量【转换成GB】 long totalSpace = f.getTotalSpace() / 1024 / 1024 / 1024; //获取剩余容量【转换成GB】 long freeSpace1 = f.getFreeSpace() / 1024 / 1024 / 1024; System.out.println((char) (i - 32) + "盘容量:" + freeSpace1 + "/" + totalSpace + "\t剩余可用容量:" + (totalSpace - freeSpace1)+"GB"); } }
-
使用Java自带函数:
File.listRoots()
判断操作
-
方法名
-
boolean exists():
测试此抽象路径名表示的文件或目录是否存在。 -
boolean isDirectory():
测试此抽象路径名表示的文件是否为目录。 -
boolean isFile():
测试此抽象路径名表示的文件是否为普通文件。 -
boolean isHidden():
测试此抽象路径名命名的文件是否为隐藏文件。
-
-
示例代码
// 判断操作 { File file = new File("G:\\DY电影\\亡命救护车.ts"); // boolean exists():测试此抽象路径名表示的文件或目录是否存在。 boolean exists = file.exists(); System.out.println("文件或目录是否存在:" + exists);//文件或目录是否存在:true // boolean isDirectory():测试此抽象路径名表示的文件是否为目录。 boolean directory = file.isDirectory(); System.out.println("是否为目录:" + directory);//是否为目录:false // boolean isFile():测试此抽象路径名表示的文件是否为普通文件。 boolean isFile = file.isFile(); System.out.println("是否为普通文件:" + isFile);//是否为普通文件:true // boolean isHidden():测试此抽象路径名命名的文件是否为隐藏文件。 File hiddenFile = new File("./file/hidden.txt"); boolean hidden = hiddenFile.isHidden(); System.out.println("文件是否为隐藏文件:" + hidden);//文件是否为隐藏文件:true }
路径查询操作-非列表
-
方法名
-
String getPath():
将此抽象路径名转换为路径名字符串。【相对路径】 -
File getAbsoluteFile():
返回此抽象路径名的绝对形式。 -
String getAbsolutePath():
返回此抽象路径名的绝对路径名字符串。【绝对路径】 -
File getCanonicalFile():
返回此抽象路径名的规范形式。 -
String getCanonicalPath():
返回此抽象路径名的规范路径名字符串。 -
String getName():
返回由此抽象路径名表示的文件或目录的名称。- 返回的类型【
文件名.扩展名
】例如:name.txt
- 返回的类型【
-
String getParent():
返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。 -
File getParentFile():
返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。
-
-
示例代码
// 路径查询操作-非列表 { File file = new File("./file/name.txt"); // String getPath():将此抽象路径名转换为路径名字符串。【获取全路径的字符串形式】 String path = file.getPath(); //相对路径:.\file\name.txt System.out.println("相对路径:" + path); // File getAbsoluteFile():返回此抽象路径名的绝对形式。 File absoluteFile = file.getAbsoluteFile(); //抽象路径名的绝对形式:F:\JavaCode\JavaStudyByMsb\.\file\name.txt System.out.println("抽象路径名的绝对形式:" + absoluteFile); // String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。 String absolutePath = file.getAbsolutePath(); //绝对路径名字符串:F:\JavaCode\JavaStudyByMsb\.\file\name.txt System.out.println("绝对路径名字符串:" + absolutePath); // File getCanonicalFile():返回此抽象路径名的规范形式。 try { File canonicalFile = file.getCanonicalFile(); //抽象路径名的规范形式:F:\JavaCode\JavaStudyByMsb\file\name.txt System.out.println("抽象路径名的规范形式:" + canonicalFile); } catch (IOException e) { e.printStackTrace(); } // String getCanonicalPath():返回此抽象路径名的规范路径名字符串。 try { String canonicalPath = file.getCanonicalPath(); //抽象路径名的规范路径名字符串:F:\JavaCode\JavaStudyByMsb\file\name.txt System.out.println("抽象路径名的规范路径名字符串:" + canonicalPath); } catch (IOException e) { e.printStackTrace(); } // String getName():返回由此抽象路径名表示的文件或目录的名称。 String name = file.getName(); //文件或目录的名称:name.txt System.out.println("文件或目录的名称:" + name); // String getParent():返回此抽象路径名的父路径名字符串,如果此路径名未命名为父目录,则返回null。 String parent = file.getParent(); //抽象路径名的父路径名字符串:.\file System.out.println("抽象路径名的父路径名字符串:" + parent); // File getParentFile():返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。 File parentFile = file.getParentFile(); //抽象路径名的父:.\file System.out.println("抽象路径名的父:" + parentFile); }
路径查询操作-列表
-
方法名
-
String[] list():
返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 -
String[] list(FilenameFilter filter):
返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 -
File[] listFiles():
返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。- 返回数数组元素格式:
路径\文件.扩展名
- 返回数数组元素格式:
-
File[] listFiles(FileFilter filter):
返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。- 返回数数组元素格式:
路径\文件.扩展名
- 返回数数组元素格式:
-
File[] listFiles(FilenameFilter filter):
返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 -
static File[] listRoots():
列出可用的文件系统根。【获取本地所有磁盘】
-
-
示例代码
// 路径查询操作-列表 { File file = new File("./file"); // String[] list():返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 String[] list = file.list(); //file目录中的文件和目录:[a, hidden.txt, name.txt, temp, time.txt, write, write.txt, 新建文本文档.txt, 这是文件名] System.out.println("file目录中的文件和目录:" + Arrays.toString(list)); // String[] list(FilenameFilter filter):返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 //只输出名称以字母t开头的文件,不区分大小写 FilenameFilter fileNameFilter = (dir, fileName) -> "t".equalsIgnoreCase(fileName.split("")[0]); String[] list1 = file.list(fileNameFilter); //[temp, time.txt] System.out.println(Arrays.toString(list1)); // File[] listFiles():返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 File[] files = file.listFiles(); //[.\file\a, .\file\hidden.txt, .\file\name.txt, .\file\temp, .\file\time.txt, .\file\write, .\file\write.txt, .\file\新建文本文档.txt, .\file\这是文件名] System.out.println(Arrays.toString(files)); // File[] listFiles(FileFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 //只查找txt文件 FileFilter fileFilter = fileName -> fileName.getName().contains(".txt"); File[] files1 = file.listFiles(fileFilter); //[.\file\hidden.txt, .\file\name.txt, .\file\T.txt, .\file\time.txt, .\file\write.txt, .\file\新建文本文档.txt] System.out.println(Arrays.toString(files1)); // File[] listFiles(FilenameFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 //只输出名称以字母t开头的文件,不区分大小写 File[] files2 = file.listFiles(fileNameFilter); //[.\file\hidden.txt, .\file\name.txt, .\file\T.txt, .\file\time.txt, .\file\write.txt, .\file\新建文本文档.txt] // [.\file\T.txt, .\file\temp, .\file\time.txt] System.out.println(Arrays.toString(files2)); // static File[] listRoots():列出可用的文件系统根。【获取本地所有磁盘】 File[] files3 = File.listRoots(); //[C:\, D:\, F:\, G:\, H:\] System.out.println(Arrays.toString(files3)); }
递归删除指定目录下的所有文件/文件夹
/**
* 递归删除指定目录下的所有文件/文件夹-写法1
* @param rootFile 指定目录
*/
public static void deleteAll(File rootFile){
File[] allFiles = rootFile.listFiles();
for (File file : allFiles) {
//如果是文件,则进行删除
if(file.isFile()){
file.delete();
System.out.println("文件:"+file.getAbsoluteFile());
}else{
//如果是文件夹,递归调用
deleteAll(file);
//删除完所有的文件之后,删除自己
file.delete();
System.out.println("文件夹:"+file.getAbsoluteFile());
}
}
//最后删除自己这个根目录
rootFile.delete();
return;
}
/**
* 递归删除指定目录下的所有文件/文件夹-写法2
* @param rootFile 指定目录
*/
public static void deleteAll2(File rootFile){
//如果是文件夹
if (rootFile.isDirectory()) {
//删除所有的子项
for (File file : rootFile.listFiles()) {
deleteAll2(file);
}
}
//然后删除自己
rootFile.delete();
}