2017-03-07 13 views
0

ファイルウォーカーを使ってファイルシステムの指定された場所の内容を再帰的に読み取る小さなアプリケーションを作成しようとしています。私はこのコードを持っています:なぜリストは変わらないのですか?

/* Imports here */ 

public class App { 

    private static Scanner inp; 
    public static List<Node> Tree = new ArrayList<Node>(); 

    public static void main(String[] args) { 
     String FFiles; 

     System.out.print("Enter root directory: "); 
     inp = new Scanner(System.in); 

     FileSystem fileSystem = FileSystems.getDefault(); 
     Path rootPath = fileSystem.getPath(inp.nextLine()); 

     FileVisitor<Path> simpleFileVisitor = new SimpleFileVisitor<Path>() { 
       public Path VisitedDirectory = rootPath; 
       public List<Node> files = new ArrayList<Node>(); 


       @Override 
       public FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs) throws IOException { 
       if (dir != VisitedDirectory) { 
        Node directory = new Node(dir.getFileName().toString(), "directory", files, dir.toString()); 
        files.add(directory); 
        Node VisDirectory = new Node(VisitedDirectory.getFileName().toString(), "directory", files, dir.toString()); 
        Tree.add(VisDirectory); 

        files.clear(); 
       } 
       return FileVisitResult.CONTINUE; 
       } 

       @Override 
       public FileVisitResult visitFile(Path visitedFile,BasicFileAttributes fileAttributes) throws IOException { 
       Node file = new Node(visitedFile.getFileName().toString(), "file", null, visitedFile.toString()); 
       files.add(file); 
       return FileVisitResult.CONTINUE; 
       } 
     }; 



     try { 
      Files.walkFileTree(rootPath, simpleFileVisitor); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 

     for (Node n : Tree) { 
      System.out.println(n); 
     } 
    } 

そして、ここに質問があります:なぜそれはディレクトリだけを読む(表示する)のですか? P.SのNodeクラスは、変数だけのカップルであるので、同じように宣言:

public class Node { 
    @Override 
    public String toString() { 
     return "Node [path=" + path + "]"; 
    } 

    public String name; 
    public String path; 
    public String type; 
    public List<Node> children = new ArrayList<Node>(); 
    public Node(String name, String type, List<Node> children, String path) { 
     this.name = name; 
     this.type = type; 
     this.children = children; 
     this.path = path; 
    } 
} 
+0

visitFileメソッドにブレークポイントを配置します。実行がヒットするかどうかを確認します。訪問先ディレクトリのツリーリストにも追加します。訪問ファイルでは、 – efekctive

答えて

0

はあなたがfilesリストで大きな混乱を作っています。 1つのインスタンスしか作成しません。つまり、new Node(VisitedDirectory.getFileName().toString(), "directory", files, dir.toString())はファイルリストを実際にコピーするのではなく、単に参照を保存するだけです。あなたのfiles.clear()コールはあなたが持っているすべてのファイルリストをクリアします。このため、Treeに追加するノードだけが生き残ります。

Treeの名前を小文字に変更してください。このようにして、Tree.add()Treeクラスの静的メソッドを呼び出します。

関連する問題