所谓的递归就是方法自己调用自己的一个过程,在实际的开发中递归用的最多的地方就是遍历文件夹:
为了使上面的目录看起来有层次,就要有缩进,这里的当进入一级目录的时候就要缩进,就是在调用这个方法的时候要缩进,在这里可以定义
一个变量,用来表示多少个缩进的,因为这里的不确定的。但是不能定义在listAll这个方法里的,因为当调用的时候这个方法会不断的进栈,
每一次都会有一个新的变量的。最好的方法就是在调用的时候传递一个值,然后在方法中自增就行
class Demo{
public static void main(String[] args){
File dir = new File("C:\\demo");//这里表示的就是遍历c盘下的文件夹demo,这里不要整个的遍历c盘,因为有隐藏文件,会出问题,返回为null的
listAll(dir,0);//这个方法的作用就是遍历指定的文件夹的
}
public static void listAll(File dir,int level){
//这个方法表示的就是列出dir文件下的所有的文件夹及文件(这里只会列出当前的文件的)
File[] file = dir.listFiles();//这个方法返回的值是一个数组,然后就要去循环的取出这个数组。
System.out.println(getSpace(level)+dir.getName());//打印出当前目录的值
level++;
for(int i = 0;i <file.length;i++){
//在这里要判断如果该目录下是一个文件夹就继续的遍历,否则的话就打印出当前的文件名
if(file[i].isDirectory()){
listAll(file[i],level);
}
else{
System.out.println(getSpace(level)+file[i].getName());
}
}
}
public static String getSpace(int level){
StringBuilder sb = new StringBuilder();
for(int i = 0; i<level; i++){
sb.append(" ");
}
return sb.toString();
}
}
为了使上面的目录看起来有层次,就要有缩进,这里的当进入一级目录的时候就要缩进,就是在调用这个方法的时候要缩进,在这里可以定义
一个变量,用来表示多少个缩进的,因为这里的不确定的。但是不能定义在listAll这个方法里的,因为当调用的时候这个方法会不断的进栈,
每一次都会有一个新的变量的。最好的方法就是在调用的时候传递一个值,然后在方法中自增就行
这就是一个简单的递归的用法
递归是可以使用循环来解决的,但是递归作为一种算法,在实际的开发中用法更为的常见。联系递归的方法有,计算指定数字的加法,在学习递归的时候要注意有一个问题就是如果递归的次数太多的话就会出现栈内存的溢出。
递归的另一个练习:(删除指定目录下的文件)在Windows中删除目录文件是一层层的删除的,即如果文件夹中有内容是删除不掉的,必须先递归然后挨个删除文件夹中的内容才行.
class DemoDiGui2{
public static void main(String[]args){
File dir = new File("C:\\demo");
removeDir(dir);
}
public static removeDir(File dir){
System.out.println(dir);
//使用方法将dir目录下的所有的文件打印出来
File files = dir.listFiles();
for(File file:files){
if(file.isDirectory()){
removeDir(file);//这里使用递归如果是目录的话就继续的递归
}
else{
file.delete();
}
}
dir.delete();//表示将文件删除完之后,在将文件夹删除
}
}