按照特定格式,列出目录下面所有的子目录和文件

做一个程序,输入一个参数:开始目录,把此目录下的所有目录和文件结构导入到export.txt文件,结构如下
c:\目录1
****|_目录11
****|_目录12
****|*** |_目录121
****|_目录33
****|**|_目录122
****|**|_目录132
****|***** |_目录532
****|******** |_file.exe
****|_file.doc
****|_file2.txt

我知道用递归可以列出来,但是要按照上面的这种格式,怎么都想不出来,请教各位!注意:上面格式的特点是,同一个目录下的目录和文件要连在一起的。这个不会,望解答!谢谢!
(还有一点:格式里的星号原本是空格来的,但是发表时空格被去掉了,所以我用同样长度的星号代替,请高手改回空格,多谢啦!)

[code="java"]import java.io.File;
import java.util.*;

public class TestTree {

public static class TreeNode {
    private File file;
    private int level;
    private boolean isEnd;

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public boolean isEnd() {
        return isEnd;
    }

    public void setEnd(boolean isEnd) {
        this.isEnd = isEnd;
    }

    public TreeNode(File fileNode, int level, boolean isEnd) {
        this.file = fileNode;
        this.level = level;
        this.isEnd = isEnd;
    }

    @Override
    public String toString() {
        return "[" + file.getPath() + "," + level + "," + isEnd + "]";
    }
}

public static void main(String[] args) {
    File f = new File("D:/test");
    TreeNode root = new TreeNode(f, 0, true);

    int cursor = 0;
    List<TreeNode> list = new ArrayList<TreeNode>();
    list.add(root);

    do {
        tree(cursor, list);
        cursor++;
    } while (cursor < list.size());

    boolean[] haveLine = new boolean[20];
    int level;
    String line;
    for (int i = 0; i < list.size(); i++) {
        line = "";
        level = list.get(i).getLevel();
        for (int j = 0; j < level; j++) {
            if (haveLine[j]) {
                line = line + "|***";
            } else {
                line = line + "****";
            }
        }

        haveLine[level] = !list.get(i).isEnd();

        if (level != 0) {
            line = line + "|_";
        }

        line = line + list.get(i).getFile().getPath();
        System.out.println(line);
    }

}

private static void tree(int currentCursor, List<TreeNode> list) {
    File file = list.get(currentCursor).getFile();

    if (!file.isDirectory()) {
        return;
    }
    int newLevel = list.get(currentCursor).getLevel() + 1;

    List<TreeNode> newList = new ArrayList<TreeNode>();
    File[] childs = file.listFiles();

    for (int i = 0; i < childs.length; i++) {
        boolean isEnd = false;
        if (i == childs.length - 1) {
            isEnd = true;
        }
        TreeNode node = new TreeNode(childs[i], newLevel, isEnd);
        newList.add(node);
    }
    list.addAll(currentCursor + 1, newList);
}

}[/code]

测试过可用:
D:\test
****|_D:\test\a
****|***|_D:\test\a\e
****|***|_D:\test\a\f.txt
****|_D:\test\b
****|_D:\test\c
****|_D:\test\a.txt

其实就是树的广度优先遍历,你遍历一个目录后,把这个目录先所有的子目录和文件放到一个队列里,然后操作队列,当队列元素是目录时,把这个目录的子目录和文件也放到队列里..., 如果是文件,直接显示。

考虑到你要分级显示,需要带一个属性表示元素处于第几级。

直接新建一个类 把下面代码复制进去 改一下类名 运行main方法 即可
package time.test;
import java.io.*;

public class FileList {

public static void main(String[] args) {

File f = new File("d:/dzh2/cfg/");

System.out.println("目录:"+f.getPath());

tree(f, 1);

}

// 递归方法   
private static void tree(File f, int level) {    
    String preStr = "";   
    for (int i = 0; i < level; i++) {   
        preStr =preStr+ "**";   
    }   

    File[] childs = f.listFiles();   
    for (int i = 0; i < childs.length; i++) {   
        System.out.println(preStr+"|_" + childs[i].getName());   
        if (childs[i].isDirectory()) {   
            tree(childs[i], level + 1);   
        }   
    }   
}   

}

不明白你的意思 我感觉我用的那种方法已经就行了
打印出来就是这种结构啊
[img]

目录:d:\dzh2\cfg
--|_mktgroup.xml
--|_Pages
----|_css
------|_css.css
----|_hkey.html
----|_hkindex.html
----|_images
------|_managetopbt.gif
------|_Thumbs.db
----|_newsindex.html
----|_stkindex.html

[/img]