建了一个Node类,内有属性Node parent,String name 设置了get set方法。C盘下有a文件夹,内有b,c子文件夹,b内有b1.txt,b2.txt.c内有c1.txt,c2.txt.在main方法中调用如下:
public static void main(String[] args) {
File file = new File("C:\\a");
printTree(file,null);
} public static void printTree(File file,Node parent) { if (file == null || !file.exists()) {
return;
}
if(parent!=null){
System.out.println(file.getName()+"   "+parent.getName());
}
boolean isLeaf = file.isFile(); Node node = new Node();
node.setName(file.getName());           //句3
node.setParent(parent);
node.setLeaf(isLeaf);
if(node.getParent()!=null){
System.out.println(node.getParent().getName());
}
File[] subs = file.listFiles();
if (subs != null && subs.length > 0) {
for (int i = 0; i < subs.length; i++) {
printTree(subs[i], node);
}
}
}
输出结果如下:
b   a
a
b1.txt   b
b             //句4  
b2.txt   b   //句1
b            //句2
c   a        //句6
a
c1.txt   c
c
c2.txt   c
c
不太明白句1和句2的输出。到句4输出后,此时的句5,Node的name已经被设置成b1.txt,再次循环输出b2的时候,此时通过printTree(subs[i], node)方法传去出的参数node已经是b1.txt,为什么句6输出的parent.getName())是a呢?希望有人能帮助一下!!

解决方案 »

  1.   

    我想你是搞糊涂了,递归用的是堆栈,看看堆栈中的内容就明白了push a  null 执行 printTree(a,b)
    push b  a    执行 printTree(b1.txt,b)
    pop  b  a    printTree(b1.txt,b)完成
    push b  a    执行 printTree(b2.txt,b)
    pop  b  a    printTree(b2.txt,b)完成
    pop  a  null printTree(a,b)完成
    push a  null 执行 printTree(c,a)
    push c  a    执行 printTree(c1.txt,c)
    pop  c  a    printTree(c1.txt,c)完成
    push c  a    执行 printTree(c2.txt,c)
    pop  c  a    printTree(c2.txt,c)完成
    pop  a null  
      

  2.   

    晕,这很简单的啊,这个程序的意思是:
    从文件夹a开始查找他的子文件,如果他的子文件也是个文件夹的话就递归。
    File[] subs = file.listFiles(); 
    if (subs != null && subs.length > 0) { 
    for (int i = 0; i < subs.length; i++) { 
    printTree(subs[i], node); 
    就是来判断他的子文件是否是文件夹的。如果subs!=null,那么就是说该文件是子文件夹,
    那么干嘛呢?从.listFiles()得出的子文件数组依次找他的子文件啊。那当然是
    b1.txt  b 
    b            //句4  
    b2.txt  b  //句1 
    b            //句2 
    这样输出的啊。如果假设b的文件夹下有:b1.txt,b2,txt,d(文件夹)这3个文件,而d:d1.txt
    那么部分输出是:
    b1.txt b
    b
    b2.txt b
    b
    d b
    b
    d1.txt d
    d
    自己慢慢理解吧,不要急,一步步的来,总会弄懂的。
      

  3.   

    晕,这很简单的啊,这个程序的意思是:
    从文件夹a开始查找他的子文件,如果他的子文件也是个文件夹的话就递归。
    File[] subs = file.listFiles(); 
    if (subs != null && subs.length > 0) { 
    for (int i = 0; i < subs.length; i++) { 
    printTree(subs[i], node); 
    就是来判断他的子文件是否是文件夹的。如果subs!=null,那么就是说该文件是子文件夹,
    那么干嘛呢?从.listFiles()得出的子文件数组依次找他的子文件啊。那当然是
    b1.txt  b 
    b            //句4  
    b2.txt  b  //句1 
    b            //句2 
    这样输出的啊。如果假设b的文件夹下有:b1.txt,b2,txt,d(文件夹)这3个文件,而d:d1.txt
    那么部分输出是:
    b1.txt b
    b
    b2.txt b
    b
    d b
    b
    d1.txt d
    d
    自己慢慢理解吧,不要急,一步步的来,总会弄懂的。
      

  4.   

    这个程序的意思是:
    从文件夹a开始查找他的子文件,如果他的子文件也是个文件夹的话就递归。
    File[] subs = file.listFiles();
    if (subs != null && subs.length > 0) {
    for (int i = 0; i < subs.length; i++) {
    printTree(subs[i], node);
    就是来判断他的子文件是否是文件夹的。如果subs!=null,那么就是说该文件是子文件夹,
    那么干嘛呢?从.listFiles()得出的子文件数组依次找他的子文件啊。那当然是
    b1.txt  b
    b            //句4 
    b2.txt  b  //句1
    b            //句2
    这样输出的啊。如果假设b的文件夹下有:b1.txt,b2,txt,d(文件夹)这3个文件,而d:d1.txt
    那么部分输出是:
    b1.txt b
    b
    b2.txt b
    b
    d b
    b
    d1.txt d
    d
    自己慢慢理解吧,不要急,一步步的来,总会弄懂的
      

  5.   

    push a  null 执行 printTree(a,b)
    push b  a    执行 printTree(b1.txt,b)
    pop  b  a    printTree(b1.txt,b)完成
    push b  a    执行 printTree(b2.txt,b)
    pop  b  a    printTree(b2.txt,b)完成
    pop  a  null printTree(a,b)完成
    push a  null 执行 printTree(c,a)
    push c  a    执行 printTree(c1.txt,c)
    pop  c  a    printTree(c1.txt,c)完成
    push c  a    执行 printTree(c2.txt,c)
    pop  c  a    printTree(c2.txt,c)完成
    pop  a null  
      

  6.   


    import java.io.File;public class fileview { /**
     * @param args
     */
    public static void displayFile(String path){
    File file=new File(path);
    if(file.isFile()){
    System.out.println(file.getName());
    }else{
    System.out.println("<DIR>"+file.getName());
    String[] fileList=file.list();
    String pathname=file.getAbsolutePath();//得到文件的抽象路径名的绝对路径名字符串
    for(int i=0;i<fileList.length;i++){
    //递归调用
    displayFile(pathname+File.separator+fileList[i]);
    }
    }
    }
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    fileview.displayFile("D:/编程软件课程");
    }}我也变过类似的代码。楼主的问题应该是
    File[] subs = file.listFiles();
    if (subs != null && subs.length > 0) {
    for (int i = 0; i < subs.length; i++) {
    printTree(subs[i], node);

    }
    换到最上面看看,比较一下。