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();
}