假设有一个目录,包含很多文件和子目录,子目录又有若干子目录,请问如何用Java生成类似下面这样的效果?
自己调了半天,超过三级目录前面的竖线就开始对不齐了,快抓狂了,请高手指点,谢谢.upload
┣根目录文件1.txt
┣根目录文件2.txt
┣目录1
┃┣1.1.txt
┃┣1.2.txt
┃┣目录1.1
┃┃┣1.1.1.jnt
┃┃┣1.1.2.txt
┃┃┗目录1.1.1
┃┃ ┣New Text Document (2).txt
┃┃ ┗New Text Document.txt
┃┗目录1.2
┃ ┣New Text Document (2).txt
┃ ┗New Text Document.txt
┗目录2
 ┗2.1.txt

解决方案 »

  1.   

    应该有,你发GUI版问一下会更好。
      

  2.   


    import java.io.File;
    public class MyTester { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    File root=new File("D:\\MyEclipse 7.0\\test");
    System.out.println(root.getName());
    listFiles(root,0);
    } private static void listFiles(File root,int level) {
    // 判断root合法性省略
    File[] f=root.listFiles();
    for(File ff:f){
    if(ff.isFile()){
    for(int i=0;i<level;i++){
    System.out.print("┃");
    }
    System.out.println("┣"+ff.getName());
    }else{
    for(int i=0;i<level;i++){
    System.out.print("┃");
    }
    System.out.println("┗"+ff.getName());
    listFiles(ff,++level);
    //这行很关键
    --level;
    }

    }
    }}
      

  3.   

    谢谢回复,不过有些地方不是我想要的效果,用你的代码生成一个目录,例如:
    1一些┗符号应该是┣,例如红色标记的,下面还有并列的节点.
    2一些┣符号应该是┗,例如蓝色标记的,这个节点应该是它的父节点所有子节点的结束,应该用┗ 
    我也是这三种符号处理不好,逻辑有点复杂.
    c
    ┣DiskDigger.exe
    E66
    ┃┗10538~10605证书
    ┃┃┣10538~10605.cer
    ┃┃10538~10605.key
    ┃┣10538~10605证书.rar
    ┃┣DOSPY 签名工具 v2.2.8.0428.exe
    ┃┣IME.txt
    My Games
    ┃┗Dungeon Siege 2
    ┃┃┣DungeonSiege2.ini
    ┃┃┗Keys
    ┃┃┗Logs
    ┃┃┃┣DungeonSiege2.crash
    ┃┃┃dxdiag.txt
    ┃┃┗Save
    ┃┃┃┣current.gas
    ┃┃┃┣prefs.gas
    ┃┃┃┗SinglePlayer
    ┃┃┃┃┗Ming
    ┃┃┃┃┃┣Ming.ds2party
    ┃┃┃┃┃┣Ming.ds2party.bak
    ┃┃┃┃┃┣Ming.ds2radar
    ┃┃┃┃┃┣Ming.ds2radar.bak
    ┃┃┃┃┗YMX
    ┃┃┃┃┃┣YMX.ds2party
    ┃┃┃┃┃┣YMX.ds2party.bak
    ┃┃┃┃┃┣YMX.ds2radar
    ┃┃┃┃┃┣YMX.ds2radar.bak
    ┃┃┗Screenshots
    ┗恢复
    ┃┣sector117242.doc
    ┃┣sector118155.png
      

  4.   

    对了,还有个问题是下面用红色标记的竖线是不应该有的,应为它下面不在有节点了.┃┣IME.txt 
    ┗My Games 
    ┃┗Dungeon Siege 2 
    ┣DungeonSiege2.ini 
    ┗Keys 
    ┗Logs 
    ┃┣DungeonSiege2.crash 
    ┃┣dxdiag.txt 
    ┗Save 
    ┃┣current.gas 
    ┃┣prefs.gas 
    ┃┗SinglePlayer 
    ┃┃┗Ming 
    ┃┃┃┣Ming.ds2party 
    ┃┃┃┣Ming.ds2party.bak 
    ┃┃┃┣Ming.ds2radar 
    ┃┃┃┣Ming.ds2radar.bak 
    ┃┃┗YMX 
    ┃┃┣YMX.ds2party 
    ┃┃┣YMX.ds2party.bak 
    ┃┃┣YMX.ds2radar 
    ┃┃┣YMX.ds2radar.bak 
    ┗Screenshots 
    ┗恢复
      

  5.   

    应该是这个意思吧:import java.io.File;
    import java.util.Stack;public class FileTreeTest {
        
        public static void main(String[] args) {
            FileTree tree = new FileTree("D:/green/apache/apache-tomcat-5.5.12/server");
            tree.tree();        
        }
    }class FileTree {
        
        private File root;
        
        public FileTree(File root) {
            this.root = root;
        }
        
        public FileTree(String rootName) {
            this(new File(rootName));
        }
        
        public void tree() {
            Stack<Boolean> lastStack = new Stack<Boolean>();
            tree(root, 0, lastStack);
        }    private void tree(File dir, int level, Stack<Boolean> lastStack) {
            if(dir == null || !dir.exists()) {
                return;
            }
            printFile(dir, level, lastStack);
            
            if(dir.isFile()) {            
                return;
            }
            File[] children = dir.listFiles();
            for(int i = 0; i < children.length; i++) {
                lastStack.push(i == children.length - 1);
                tree(children[i], level + 1, lastStack);
                lastStack.pop();
            }
        }
        
        private void printFile(File file, int level, Stack<Boolean> lastStack) {
            for(int i = 0, k = lastStack.size() - 1; i < k; i++) {
                System.out.print(lastStack.get(i) ? "  " : "│ ");
            }        
            if(level > 0) {            
                System.out.print(lastStack.get(lastStack.size() - 1) ? "└ " : "├ ");
            }
            System.out.println(level == 0 ? file.getPath() : file.getName());        
        }
    }
    D:\green\apache\apache-tomcat-5.5.12\server
    ├ classes
    ├ lib
    │ ├ catalina-ant-jmx.jar
    │ ├ catalina-ant.jar
    │ ├ catalina-cluster.jar
    │ ├ catalina-optional.jar
    │ ├ catalina-storeconfig.jar
    │ ├ catalina.jar
    │ ├ commons-modeler.jar
    │ ├ servlets-cgi.renametojar
    │ ├ servlets-default.jar
    │ ├ servlets-invoker.jar
    │ ├ servlets-ssi.renametojar
    │ ├ servlets-webdav.jar
    │ ├ tomcat-ajp.jar
    │ ├ tomcat-apr.jar
    │ ├ tomcat-coyote.jar
    │ ├ tomcat-http.jar
    │ └ tomcat-util.jar
    └ webapps
      ├ host-manager
      │ ├ host-manager.xml
      │ ├ images
      │ │ ├ add.gif
      │ │ ├ code.gif
      │ │ ├ design.gif
      │ │ ├ docs.gif
      │ │ ├ fix.gif
      │ │ ├ jakarta-logo.gif
      │ │ ├ tomcat.gif
      │ │ ├ update.gif
      │ │ └ void.gif
      │ ├ manager.xml
      │ └ WEB-INF
      │   ├ lib
      │   │ └ catalina-host-manager.jar
      │   └ web.xml
      └ manager
        ├ html-manager-howto.html
        ├ images
        │ ├ add.gif
        │ ├ code.gif
        │ ├ design.gif
        │ ├ docs.gif
        │ ├ fix.gif
        │ ├ jakarta-logo.gif
        │ ├ tomcat.gif
        │ ├ update.gif
        │ └ void.gif
        ├ manager-howto.html
        ├ manager.xml
        ├ status.xsd
        ├ WEB-INF
        │ ├ lib
        │ │ ├ catalina-manager.jar
        │ │ └ commons-fileupload-1.0.jar
        │ └ web.xml
        └ xform.xsl
      

  6.   

    再改一下,用粗线显示:import java.io.File;
    import java.util.Stack;public class FileTreeTest {
        
        public static void main(String[] args) {
            FileTree tree = new FileTree("D:/green/apache/apache-tomcat-5.5.12/server");
            tree.tree();        
        }
    }class FileTree {
        
        private File root;
        
        public FileTree(File root) {
            this.root = root;
        }
        
        public FileTree(String rootName) {
            this(new File(rootName));
        }
        
        public void tree() {
            Stack<Boolean> lastStack = new Stack<Boolean>();
            tree(root, 0, lastStack);
        }    private void tree(File dir, int level, Stack<Boolean> lastStack) {
            if(dir == null || !dir.exists()) {
                return;
            }
            printFile(dir, level, lastStack);
            
            if(dir.isFile()) {            
                return;
            }
            File[] children = dir.listFiles();
            for(int i = 0; i < children.length; i++) {
                lastStack.push(i == children.length - 1);
                tree(children[i], level + 1, lastStack);
                lastStack.pop();
            }
        }
        
        private void printFile(File file, int level, Stack<Boolean> lastStack) {
            for(int i = 0, k = lastStack.size() - 1; i < k; i++) {
                System.out.print(lastStack.get(i) ? "  " : "┃ ");
            }        
            if(level > 0) {            
                System.out.print(lastStack.peek() ? "┗ " : "┣ ");
            }
            System.out.println(level == 0 ? file.getPath() : file.getName());        
        }
    }D:\green\apache\apache-tomcat-5.5.12\server
    ┣ classes
    ┣ lib
    ┃ ┣ catalina-ant-jmx.jar
    ┃ ┣ catalina-ant.jar
    ┃ ┣ catalina-cluster.jar
    ┃ ┣ catalina-optional.jar
    ┃ ┣ catalina-storeconfig.jar
    ┃ ┣ catalina.jar
    ┃ ┣ commons-modeler.jar
    ┃ ┣ servlets-cgi.renametojar
    ┃ ┣ servlets-default.jar
    ┃ ┣ servlets-invoker.jar
    ┃ ┣ servlets-ssi.renametojar
    ┃ ┣ servlets-webdav.jar
    ┃ ┣ tomcat-ajp.jar
    ┃ ┣ tomcat-apr.jar
    ┃ ┣ tomcat-coyote.jar
    ┃ ┣ tomcat-http.jar
    ┃ ┗ tomcat-util.jar
    ┗ webapps
      ┣ host-manager
      ┃ ┣ host-manager.xml
      ┃ ┣ images
      ┃ ┃ ┣ add.gif
      ┃ ┃ ┣ code.gif
      ┃ ┃ ┣ design.gif
      ┃ ┃ ┣ docs.gif
      ┃ ┃ ┣ fix.gif
      ┃ ┃ ┣ jakarta-logo.gif
      ┃ ┃ ┣ tomcat.gif
      ┃ ┃ ┣ update.gif
      ┃ ┃ ┗ void.gif
      ┃ ┣ manager.xml
      ┃ ┗ WEB-INF
      ┃   ┣ lib
      ┃   ┃ ┗ catalina-host-manager.jar
      ┃   ┗ web.xml
      ┗ manager
        ┣ html-manager-howto.html
        ┣ images
        ┃ ┣ add.gif
        ┃ ┣ code.gif
        ┃ ┣ design.gif
        ┃ ┣ docs.gif
        ┃ ┣ fix.gif
        ┃ ┣ jakarta-logo.gif
        ┃ ┣ tomcat.gif
        ┃ ┣ update.gif
        ┃ ┗ void.gif
        ┣ manager-howto.html
        ┣ manager.xml
        ┣ status.xsd
        ┣ WEB-INF
        ┃ ┣ lib
        ┃ ┃ ┣ catalina-manager.jar
        ┃ ┃ ┗ commons-fileupload-1.0.jar
        ┃ ┗ web.xml
        ┗ xform.xsl