File类简介
1.1 FIle类的作用
- File类是Java提供的针对磁盘中的文件或目录转换对象的包装类。
- 一个File对象而可以代表一个文件或目录,File对象可以实现获取文件和目录属性等功能可以实现对文件和目录的创建,删除等功能。
1.2 File类操作目录与文件的常用方法
1.2.1 针对文件的操作方法
方法 | 说明 |
---|
createNewFile() | 常见新文件 |
delet() | 直接从磁盘上删除 |
exists() | 查询磁盘中的文件是否存在 |
getAbsolutePath() | 获取绝对路径 |
getPath() | 获取相对路径 |
getName() | 获取文件名,相当于调用了一个toString方法 |
isFile() | 判断是否是文件 |
length() | 查看文件中的字节数 |
idHidden() | 测试这个抽象路径名是否是一个隐藏文件。是隐藏的返回true,否则返回false |
1.2.2 针对目录的操作方法
方法 | 说明 |
---|
exisits () | 查询当前目录是否存在 |
isDirectory() | 判断当前路径是否为目录 |
mkdir() | 创建目录 |
getPareFile() | 获取当前目录的父级目录 |
list() | 返回一个字符串数组,包含目录中的文件和目录的路径名 |
listFile() | 返回一个File数组,表示用此抽象路径名表示目录中的文件 |
1.2 File类的基本操作
案例一
package File类;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("basic grammar\\src\\File类\\example.txt");
boolean newFile = file.createNewFile();
if(newFile==true) {
System.out.println("创建文件example.txt成功!");
}else {
System.out.println("创建文件example.txt失败!");
}
System.out.println("获取文件名:"+file.getName());
System.out.println("判断是否是一个文件:"+file.isFile());
System.out.println("判断是不是一个隐藏文件:"+file.isHidden());
System.out.println("获取文件的字节数:"+file.length());
System.out.println("获取文件的相对路径:"+file.getPath());
System.out.println("获取文件的绝对路径:"+file.getAbsoluteFile());
System.out.println("删除文件example.txt:"+file.delete());
System.out.println("判断文件example.txt是否存在:"+file.exists());
}
}
案例二
package File类;
import java.io.File;
import java.io.IOException;
public class DirectoryDemo {
public static void main(String[] args) throws IOException {
File file = new File("basic grammar\\src\\File类\\example");
File file2 = new File("basic grammar/src/File类/father/son");
System.out.println("创建单级目录:"+file.mkdir());
System.out.println("判断单级目录是否存在:"+file.exists());
System.out.println("判断是不是一个目录"+file.isDirectory());
System.out.println("通过file.getParent()获取父级目录:"+file.getParent());
System.out.println("通过file.getParentFile()获取父级目录:"+file.getParentFile().getName());
File file1 = new File("basic grammar\\src\\File类\\example\\a.txt");
boolean newFile = file1.createNewFile();
if(newFile==true) {
System.out.println("创建文件example.txt成功!");
}else {
System.out.println("创建文件example.txt失败!");
}
System.out.println("------------------------file.list()");
String[] arrFile=file.list();
for(String x:arrFile) {
System.out.println(x);
}
System.out.println("------------------------file.listFiles()");
File[] files = file.listFiles();
for(File x:files) {
System.out.println(x);
}
System.out.println("------------------------");
System.out.println("删除文件:"+file1.delete());
System.out.println("删除单级目录:"+file.delete());
System.out.println("创建多级目录:"+file2.mkdirs());
System.out.println("删除多级目录:"+file2.getParentFile().delete());
}
}
遇到的问题及思考
问题:删除非空的目录失败
- 如果将删除文件的代码注释掉,就会出现,删除单级目录失败。
System.out.println("------------------------");
System.out.println("删除单级目录:"+file.delete());
System.out.println("创建多级目录:"+file2.mkdirs());
System.out.println("删除多级目录:"+file2.getParentFile().delete());
究因:delete的详细解析
- delete()方法可用于删除文件或空目录/文件夹,如果文件被删除,delete()方法返回true,如果文件不存在则返回false。
- 如果删除目录,delete()方法检查目录是否为空,如果目录为空,则删除目录,否则delete()方法不会执行任何操作并返回false,所以在这种情况下,必须递归删除所有文件,然后再删除目录。
- 删除非空目录的另一种方法是使用Files.walkFileTree()方法,在这种方法中,可以逐个处理所有文件,并在单个文件对象上调用delete()方法。
- Files.walkFileTree()方法API文档
解决方法一:非空变空法
- 将目录下的温江全部删除,使目录变为空目录,再进行删除。
File[] listFiles = file.listFiles();
for(File x:listFiles) {
System.out.println("Deleting "+x.getName());
x.delete();
}
System.out.println("删除单级目录:"+file.delete());
解决方法二:Files.walkFileTree()
Files.walkFileTree(Paths.get("basic grammar\\src\\File类\\example"),new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("进入文件夹===>"+dir);
return super.preVisitDirectory(dir, attrs);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("删除文件=>"+file.getFileName());
Files.delete(file);
return super.visitFile(file, attrs);
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("退出文件夹===>"+dir);
Files.delete(dir);
return super.postVisitDirectory(dir, exc);
}
});
System.out.println("example是否存在:"+file.exists());