2011-09-13 34 views
2

私は特定のディレクトリのファイルを一覧表示するためのJavaクラスを持っています。これは、ファイルとサブディレクトリを持たないディレクトリでうまく動作します。しかし、内部に子ディレクトリがあると、java.lang.StackOverflowError例外が発生します。ここにmain()メソッドのクラスがあります:ディレクトリにファイルをリストしているときにエラーが発生しました

package test; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class DisplayFilesAndFolders { 

    public static void main(String[] args) { 
     try { 
      List<File> files = getFileList(); 
      for(File file : files){ 
       System.out.println(file); 
      } 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static List<File> getFileList() throws FileNotFoundException{ 
     String sPath = "C:\\Users\\owner\\Desktop\\Screen Shot\\"; 
     File filePath = new File(sPath); 
     List<File> fileList = new ArrayList<File>(); 
     File[] files = filePath.listFiles(); 
     List<File> fileandFolderList = Arrays.asList(files); 
     for (File file : fileandFolderList) { 
      fileList.add(file); 
      if (file.isDirectory()) { 
       List<File> innerFileList = getFileList(); 
       fileList.addAll(innerFileList); 
      } 
     } 

     return fileList; 

    } 

} 

ありがとうございます。

答えて

4

getFileList検索のルートをパラメータとして、再帰するたびにサブディレクトリを引数として渡す必要があります。 (現時点では、各再帰呼び出しにC:\Users\owner\Desktop\Screen Shot\でオーバー始めている。)

(私のシステムで意図した通りに動作します)次のことを試してみてください。

public class Test { 

    public static void main(String[] args) { 
     try { 
      String root = "C:\\Users\\owner\\Desktop\\Screen Shot\\"; 
      List<File> files = getFileList(new File(root)); 
      for(File file : files){ 
       System.out.println(file); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static List<File> getFileList(File filePath) 
      throws FileNotFoundException{ 

     List<File> fileList = new ArrayList<File>(); 
     File[] files = filePath.listFiles(); 
     List<File> fileandFolderList = Arrays.asList(files); 
     for (File file : fileandFolderList) { 
      fileList.add(file); 
      if (file.isDirectory()) { 
       List<File> innerFileList = getFileList(file); 
       fileList.addAll(innerFileList); 
      } 
     } 

     return fileList; 
    } 
} 
+2

再帰を使用している場合、定義された停止ポイントが必要です。これは通常、再帰的メソッドに渡される引数によって決まります。引数を取らない再帰的メソッドがある場合は、問題がある可能性があります。 –

+0

同意します!最初は私のgetFileList()はString引数を持っていましたが、後者は、クラスにmain()メソッドを追加し、長期的には再帰メソッドでハードコードした場合、ユーザーが答えられると便利だと思いました... :-( – tusar

+0

@aioobeあなたが過去に私を助けて以来、私はあなたに私の別の問題を見てくださいお願いします。これに関連していませんhttp://stackoverflow.com/q/8937158/778687 – tusar

1

私は前にあなたの方法のようなものを実装しましたし、また、ファイルがシンボリックリンクであるかどうかをチェックしなかったので、StackOverflowExceptionが発生しました。ディレクトリを指すシンボリックリンクでisDirectoryを呼び出すと、trueが返されます。したがって、どこでも指すことができるシンボリックリンクをたどり、無限のツリートラバーサルをもたらし、StackOverflowExceptionが発生する可能性があります。

+0

"シンボリックリンク"の例を挙げることができますか? – tusar

+2

unix> man ln "ls -l"とすると、次のようになります。 a - > some/other/dir/a 矢印がキーです – Chris

+0

Windowsでシンボリックリンクを作成する方法についての記事だからあなたはできる あなたのコードがそれらをどのように扱うかを見てください:http://www.windows7home.net/how-to-create-symbolic-link-in-windows-7/ –

関連する問題