Java递归混乱。试图获取目录中的文件

时间:2015-07-11 21:54:52

标签: java recursion

我的目标是获取文件夹中文件的名称,如果该文件夹中有另一个文件夹,那么它还应该为我提供THAT文件夹中文件的名称。等等。

这是代码:

public class GettingDir {

public static void main(String[] args){
    File dir = new File("Numbers/");
    File[] files = dir.listFiles();
    for(File f : files){
        if(f.isDirectory()){
            System.out.println(f.getName());

            getDirectory(f.toString());
        }else{
            System.out.println(f.getName());
        }

    }

    }

这是getDirectory()方法:

public static void getDirectory(String dir){
    File place = new File(dir);
    if(place.isDirectory()){
        File[] files = place.listFiles();
        for(File f : files){
            if(f.isDirectory()){
                System.out.println(f.getName());
                getDirectory(dir);
            }else{
                System.out.println(f.getName());
            }
        }
    }
}

现在。我不完全理解错误,它是一个无限循环,然后是无限错误。一些聪明的头脑可以告诉我什么是错的吗?

P.S。对不起,如果代码很可怜,我是初学者:D

4 个答案:

答案 0 :(得分:0)

在递归函数中,您应该调用getDirectory(f);而不是getDirectory(dir);

在您的实施中,您实际上是在第一级重新开始。堆栈会溢出。

答案 1 :(得分:0)

您将目录的名称传递给getDirectory()方法,此方法只使用new File(dir)来获取文件。因此它不会从其父目录开始,而是始终从用户目录开始。使用File对象表示文件:

主要方法:

getDirectory(f);

在getDirectory方法中:

public static void getDirectory(File place){
    File[] files = place.listFiles();
    for(File f : files){
        if(f.isDirectory()){
            System.out.println(f.getName());
            getDirectory(f);
        } else {
            System.out.println(f.getName());
        }
    }
}

请注意,主要方法可以重新编译为

public static void main(String[] args){
    File dir = new File("Numbers/");
    getDirectory(dir);
}

答案 2 :(得分:0)

我远不是一个聪明的头脑,但你应该改变

getDirectory(dir);

getDirectory(f.toString());
您的getDirectory方法

中的

public static void getDirectory(String dir) {
    File place = new File(dir);
    if (place.isDirectory()) {
        File[] files = place.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                System.out.println(f.getName());
                getDirectory(f.toString());
            } else {
                System.out.println(f.getName());
            }
        }
    }
}

无论如何,只需提示,您就可以进一步简化代码:

public static void main(String[] args) {
    getDirectory("Numbers/");
}

public static void getDirectory(String dir) {
    File place = new File(dir);
    System.out.println(dir);
    if (place.isDirectory()){
        File[] files = place.listFiles();
        for (File f : files) getDirectory(f.toString());
    }
}

答案 3 :(得分:0)

你犯了一个小错误:getDirectory(dir)应该被getDirectory(f.toString())取代。最重要的是,您可以简化主要方法。

public static void getDirectory(String dir){
    File place = new File(dir);
    if(place.isDirectory()){
        File[] files = place.listFiles();
        for(File f : files){
            if(f.isDirectory()){
                System.out.println(f.getName());
                getDirectory(f.toString());
            } else{
                System.out.println(f.getName());
            }
        }
    }
}


public static void main(String[] args) {
    getDirectory("Numbers/");
}