2015-07-11 51 views
0

我的目标是获取文件夹中文件的名称,如果该文件夹内有另一个文件夹,那么它应该进一步给我THAT文件夹中的文件名称。等等。Java递归混淆。试图获取目录中的文件

这是代码:

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

回答

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/"); 
} 
0

在递归函数,你应该叫getDirectory(f);,而不是getDirectory(dir);

在你实现你实际上是在第一级重新开始。堆栈将溢出。

0

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

在main方法:

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()); 
     } 
    } 
} 

注意,主要方法可以redurced到

public static void main(String[] args){ 
    File dir = new File("Numbers/"); 
    getDirectory(dir); 
} 
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()); 
    } 
}