File
File类概述
File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)
使用File可以做到:
- 访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等
- 创建和删除文件或目录
- 访问一个目录中的子项
获取文件及其属性
- length(): 返回文件的长度, 单位是字节数(如果File是目录, 则返回0)
- exists(): 判断当前文件或目录是否存在,存在则返回true
- isFile(): 判断当前file是否为文件,是文件则返回true
- isDirectory(): 判断当前file是否为目录,是目录返回true
- getName(): 获取当前File文件或目录的名字
- getParent(): 获取当前File父目录的路径
- getAbsolutePath(): 获取当前File文件或目录的完整路径
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| package file; import java.io.File;
public class FileDemo { public static void main(String[] args) {
File file = new File("./demo.txt"); String name = file.getName(); System.out.println("文件的名字:"+name); long length = file.length(); System.out.println("文件的长度:"+length+"字节"); boolean cr = file.canRead(); System.out.println("文件是否可读:"+cr); boolean cw = file.canWrite(); System.out.println("文件是否可写:"+cw); boolean ih = file.isHidden(); System.out.println("文件是否被隐藏:"+ih); } }
|
创建文件
1
| createNewFile(): 创建指定路径和名称的文件, 如果文件不存在, 则创建并返回true, 否则就不创建并返回false
|
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package file; import java.io.File; import java.io.IOException;
public class CreateNewFileDemo { public static void main(String[] args) throws IOException { File file = new File("./test.txt"); if (file.exists()){ System.out.println("该文件已存在!!"); }else{ file.createNewFile(); System.out.println("该文件已经创建完毕!"); } } }
|
删除文件
1
| delete(): 删除文件或删除空目录, 删除成功返回true(非空目录删除会失败)
|
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package file; import java.io.File;
public class DeleteDemo { public static void main(String[] args) { File file = new File("./test.txt"); if (file.exists()){ file.delete(); System.out.println("该文件已经删除了!"); }else { System.out.println("文件不存在!"); } } }
|
创建目录
1 2
| mkdir(): 创建指定路径和名称的目录, 如果目录不存在, 则创建并返回true, 否则就不创建并返回false mkdirs(): 创建指定路径和名称的多级目录, 如果目录不存在, 则创建并返回true, 否则就不创建并返回false
|
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package file; import java.io.File;
public class MkDirDemo { public static void main(String[] args) { File dir = new File("./a/b/c/d/e/f/g/h/i/j/k"); if (dir.exists()){ System.out.println("该目录已存在!"); }else{
dir.mkdirs(); System.out.println("目录已创建!"); } } }
|
删除目录
1
| delete(): 删除文件或删除空目录, 删除成功返回true(非空目录删除会失败)
|
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package file; import java.io.File;
public class DeleteDirDemo { public static void main(String[] args) { File dir = new File("./demo"); if (dir.exists()){ dir.delete(); System.out.println("该目录已删除!"); }else { System.out.println("该目录不存在!"); } } }
|
获取目录中的子项
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package file; import java.io.File;
public class ListFilesDemo { public static void main(String[] args) { File dir = new File("."); if (dir.isDirectory()){ File[] files = dir.listFiles(); System.out.println("VN2204SE有"+files.length+"个子项"); for (int i = 0; i < files.length; i++) { System.out.println(files[i].getName()); } } } }
|
递归遍历目录
递归(recursion)是一种常见的解决问题的方法,即把问题逐渐简单化。
递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
1 2 3 4 5 6 7
| m(); ... public void m(){ ... m(); ... }
|
需要注意的是: 递归方法一定要有出口, 否则将会一直自己调用自己, 变成死循环, 严重时将会导致内存溢出!
递归有两个特点: 1:必须要利用分支控制,制造出口 2:就是不能嵌套太多层,要不然太耗费资源,容易出错
递归是重复的干一件事,循环也是一直干一件事,递归重复过程,循环重复的是步骤
需求: 遍历指定File(目录)下的所有子目录和子文件, 输出该目录下的所有目录和文件名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 思路: 声明一个diGui目录的方法, 接收一个File类型的对象, 方法内部实现如下:
1.判断当前File是否为文件(防止第一次传入的是文件)
1.1.如果file是文件, 输出: "文件不支持递归!"
1.2.如果file是目录, 则继续执行第2步
2.获取当前目录下的所有子目录及子文件对象组成的File数组
3.遍历当前目录下的所有子目录及子文件对象
5.判断当前遍历的是目录还是文件
4.1.如果当前遍历的是文件, 输出该文件的路径+名称
4.2.如果当前遍历的是目录, 输出当前目录的路径+名称
并以此目录作为根, 接着遍历该目录下的所有子目录和子文件, 输出该目录下的所有目录和文件名
|
递归获取目录的子项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package file; import java.io.File;
public class ListDirDG { public static void main(String[] args) { File file = new File("./a"); diGuiFolder(file); } private static void diGuiFolder(File file) { if (file.isFile()){ System.out.println("文件不支持递归!"); }else{ File[] fs = file.listFiles(); for (int i = 0; i < fs.length; i++) { if (fs[i].isFile()){ System.out.println("文件:"+fs[i]); }else{ System.out.println("目录:"+fs[i]); diGuiFolder(fs[i]); } } } } }
|
递归删除目录
代码案例
package file;
import java.io.File;
/**
获取一个目录中符合过滤条件的所有子项
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package file; import java.io.File; import java.io.FileFilter;
public class ListFilesDemo2 { public static void main(String[] args) { File dir = new File("."); FileFilter filter = new FileFilter() { @Override public boolean accept(File pathname) { String name = pathname.getName(); System.out.println("正在过滤:"+name); boolean o = name.contains("o"); return o; } }; File[] files = dir.listFiles(filter); for (int i = 0; i < files.length; i++) { System.out.println(files[i]); } } }
|