Java之File与递归
程序员文章站
2022-07-02 14:02:22
File类的使用和递归思想 File类 概述 文件: 存储数据 文件夹: 管理文件与文件夹 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String parent, String c ......
File类的使用和递归思想
File类
概述
文件: 存储数据
文件夹: 管理文件与文件夹
构造方法
- public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
- public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
- public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
常用方法
创建方法
- public boolean createNewFile() : 创建文件,存在返回false,不存在创建文件返回true
- boolean mkdir() : 创建文件夹,存在返回false,不存在创建文件夹返回true
- boolean mkdirs() : 创建多级文件夹,存在返回false,不存在创建多级文件夹返回true
删除方法
- boolean delete() : 删除文件或者文件夹,文件存在返回true,文件不存在返回false;
可以删除空的文件夹,如果文件夹下有子文件或者子文件夹,删除不掉
判断方法
- public boolean exists() :此File表示的文件或目录是否实际存在。
- public boolean isDirectory() :此File表示的是否为目录(文件夹)。
- public boolean isFile() :此File表示的是否为文件。
路径问题
绝对路径 : 以盘符开头
相对路径 : 相对于本项目
- public String getAbsolutePath() :返回此File的绝对路径名字符串。
- public String getParent() : 获取父路径,在创建对象时制定了父路径才能获取,没有指定返回null(相对路径返回null).
- public String getPath() :将此File转换为路径名字符串(获取构建时的路径)。
- public String getName() :返回由此File表示的文件或目录的名称。
- public long length() :返回由此File表示的文件的长度。
高级方法
- public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
- public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
递归
概述
递归就是方法内部自己调用自己.
注意事项
- 必须有出口,否则会出现栈内存溢出的错误.
- 递归的次数不宜过多.否则容易出现栈内存溢出
- 构造方法不能递归
理解
对于递归,可以使用栈来理解,入栈和出栈,对于整个程序的流程,首先,main方法入栈,接着递归方法入栈,方法内调用自己,
继续入栈,知道出口进行返回出栈,层层出栈,这个就是底层的原理吧.
计算n的阶乘
import java.util.Scanner; /** * 求n阶乘 * 1.手动输入计算的值 * 2.创建递归方法进行计算 * @author WZLOVE * @create 2018-07-20 14:34 */ public class Demo1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("请输入您要计算的值是:"); int n = in.nextInt(); in.close(); long result = getRecursive(n); System.out.println("您输入的值的阶乘计算结果为:" + result); } public static long getRecursive(int n){ // 定义出口 if( n == 1 ){ return 1; } return n * getRecursive( n - 1 ); } }
打印多级目录
package com.wzlove.recursive; import java.io.File; /** * 遍历多级目录 * * @author WZLOVE * @create 2018-07-20 15:11 */ public class Demo2 { public static void main(String[] args) { // 程序的健壮性测试 // File file = null; // File file = new File("E:\\"); // 测试路径 File file = new File("G:\\工作区间\\Intellij IDEA\\JavaSE"); printDirsAndFiles(file); } public static void printDirsAndFiles(File file){ // 程序的健壮性 if(file == null || !file.exists()){ return ; } // 如果是文件,直接输出 if(file.isFile()){ System.out.println(file.getAbsolutePath()); } // 如果是文件夹,进行遍历递 File[] files = file.listFiles(); // 如果没有访问权限,直接返回 if(files == null){ return ; } for (File file1 : files) { if(file1.isFile()){ System.out.println(file1.getAbsolutePath()); } else { System.out.println(file1.getAbsolutePath()); printDirsAndFiles(file1); } } } }
打印某个目录下的所有.java文件
两种方法,第一种:
package com.wzlove.recursive; import java.io.File; /** * 搜索G:\工作区间\Intellij IDEA\JavaSE 目录中的.java 文件。 * 1.创建File的对象,传递File的虚拟路径 * 2.递归方法 * 3.进行健壮性判断: * * null的判断 * * 文件不存在 * * 如果路径是文件,这三种情况都是直接返回 * * 如果路径合法 * (1) 判断有无权限,有继续向下,无直接返回 * (2) 返回该文件夹下的所有文件和文件夹 * (3) 增强for循环进行遍历 * 如果是文件,判断是否满足要求(递归的出口) * 如果是文件夹,进行递归调用 * * @author WZLOVE * @create 2018-07-20 16:27 */ public class Demo3 { public static void main(String[] args) { File file = new File("G:\\工作区间\\Intellij IDEA\\JavaSE"); printAllJavaFiles(file); } public static void printAllJavaFiles(File file){ if(file == null || !file.exists() || file.isFile()){ return ; } File[] files = file.listFiles(); if(files == null){ return ; } for (File file1 : files) { if(file1.isFile()){ if(file1.getName().endsWith(".java")){ System.out.println(file1.getAbsolutePath()); } }else{ printAllJavaFiles(file1); } } } }
第二种,要使用到文件过滤器:
-
File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
package com.wzlove.recursive; import java.io.File; import java.io.FileFilter; /** * * @author WZLOVE * @create 2018-07-20 16:27 */ public class Demo4 { public static void main(String[] args) { File file = new File("G:\\工作区间\\Intellij IDEA\\传智播客\\JavaSE"); printAllJavaFiles(file); } public static void printAllJavaFiles(File file){ if(file == null || !file.exists() || file.isFile()){ return ; } // 使用listFiles(FileFilter) /** * File[] listFiles(FileFilter filter) * 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 */ File[] files = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.isFile() && pathname.getName().endsWith(".java")){ // 是以.java文件结尾的文件 return true; } // 如果是文件夹,也进行返回 if(pathname.isDirectory()){ return true; } // 其余情况返回false return false; } }); for (File file1 : files) { if(file1.isFile()){ System.out.println(file1.getAbsolutePath()); }else{ printAllJavaFiles(file1); } } } }