java遍历文件展示文本格式的文件树

来源:互联网 发布:js json对象添加数据 编辑:程序博客网 时间:2024/05/22 08:06

java遍历文件展示文本格式的文件树!

昨天发神经,想用java写一个代码变历文件树,打印出结构,类似在cmd输入命令tree的结果。

本来觉得很简单,做的时候才知道有点难。要是感兴趣, 你也可以试试。

  1. package test.io;
  2. //在网上找的,听说还是老字竹原创。代码简洁,但是我费了好大的功副消化
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class Folder {
  6.     public Folder(String title) {
  7.         this.title = title;
  8.     }
  9.     private String title;
  10.     private List<Folder> children = new ArrayList<Folder>();
  11.     public void addChild(Folder f) {
  12.         children.add(f);
  13.     }
  14.     public List<Folder> getChildren() {
  15.         return children;
  16.     }
  17.     public void setChildren(List<Folder> children) {
  18.         this.children = children;
  19.     }
  20.     public String getTitle() {
  21.         return title;
  22.     }
  23.     public void setTitle(String title) {
  24.         this.title = title;
  25.     }
  26.     public String toString(String lftStr, String append) {
  27.         StringBuilder b = new StringBuilder();
  28.         b.append(append + title);
  29.         b.append("/n");
  30.         if (children.size() > 0) {
  31.             for (int i = 0; i < children.size() - 1; i++) {
  32.                 b.append(lftStr+ children.get(i).toString(lftStr + "│ "
  33. "├-"));
  34.             }
  35.             b.append(lftStr+ children.get(children.size() - 1).toString(lftStr + 
  36. "  ","└-"));
  37.         }
  38.         return b.toString();
  39.     }
  40.     public static void main(String[] args) {
  41.         Folder root = new Folder("菜单列表");
  42.         Folder f1 = new Folder("开始菜单");
  43.         root.addChild(f1);
  44.         Folder f1_1 = new Folder("程序");
  45.         f1.addChild(f1_1);
  46.         Folder f1_1_1 = new Folder("附件");
  47.         f1_1.addChild(f1_1_1);
  48.         Folder f1_1_1_1 = new Folder("娱乐");
  49.         f1_1_1.addChild(f1_1_1_1);
  50.         Folder f1_1_1_2 = new Folder("娱乐2");
  51.         f1_1_1.addChild(f1_1_1_2);
  52.         Folder f1_2 = new Folder("辅助工具");
  53.         f1.addChild(f1_2);
  54.         System.out.println(root.toString("  ""$"));
  55.     }
  56. }
  57. //**************************************
  58. //经过消化之后我修改的。可打印文件结构
  59. import java.io.*; 
  60. public class DocTree { 
  61.     File root = null
  62.      
  63.     public DocTree(File f){ 
  64.         this.root = f; 
  65.     }
  66.      
  67.     public static void main(String[] args){ 
  68.         File root = new File("c://test"); 
  69.         DocTree tree = new DocTree(root); 
  70.         System.out.println(tree.toString(" """)); 
  71.     } 
  72.      
  73.     public String toString(String leftStr, String append){ 
  74.         StringBuilder b = new StringBuilder(); 
  75.         b.append(append + root.getName()); 
  76.         b.append("/n");
  77.         if(!root.isFile()&&root.listFiles().length!=0){ 
  78.             File[] files = root.listFiles(); 
  79.             DocTree[] docTrees = new DocTree[files.length]; 
  80.             for(int i=0; i<docTrees.length; i++){ 
  81.                 docTrees[i] = new DocTree(files[i]); 
  82.             } 
  83.             for (int i=0; i<files.length-1; i++){ 
  84.                 b.append(leftStr + docTrees[i].toString(leftStr+"│""├")); 
  85.             } 
  86.             b.append(leftStr + docTrees[docTrees.length-1].toString(leftStr + " ""└")); 
  87.         } 
  88.         return b.toString(); 
  89.     }
  90. }
  91. //*****************************************
  92. //然后我还是觉得理解起来不方便, 过几天说不定就忘记了,
  93. //还是自己写一个, 虽然思想照抄, 但我觉得自己的理解起来很方便。
  94. //带注释,
  95. import java.io.*;
  96. public class Tree {
  97.     File root = null;
  98.     public Tree(File f){
  99.         this.root = f;
  100.     }
  101.     /**
  102.     test
  103.     ├1
  104.     │├目录1.txt
  105.     │├目录11
  106.     ││├111.txt
  107.     ││└112.txt
  108.     │└12
  109.     └test.pdf
  110.      */
  111.     /**
  112.      * @param root 当前正在被扫描的根文件
  113.      * @param childLeftStr 如果该文件有孩子,childLeftStr
  114.      *        表示孩子节点的左面应该打印出来的结构性信息
  115.      *        拿上面的例子来说,根结点test的孩子的左面的
  116.      *        结构信息为"" 空,结点"目录11"的孩子的结构信息为"││",
  117.      * @param junction 结点图标,如果是该结点是它父亲的最后一个结点,
  118.      *        则为"└",否则为"├".
  119.      */
  120.     
  121.     public void showTree(File root, String childLeftStr, String junction){
  122.         //打印结点的信息
  123.         System.out.println(junction + root.getName());
  124.         //如果有孩子, 而且孩子的数目不为0
  125.         if(!root.isFile()&&root.listFiles().length!=0){
  126.             File[] files = root.listFiles();
  127.             //构造孩子结点
  128.             Tree[] children = new Tree[files.length];
  129.             for(int i=0; i<files.length; i++){
  130.                 children[i] = new Tree(files[i]);
  131.             }
  132.             //打印孩子结点
  133.             for(int i=0; i<children.length-1; i++){
  134.                 //对所有的孩子结点,先打印出左边的结构信息,
  135.                 System.out.print(childLeftStr);
  136.                 //递归调用showTree, 注意参数有所变化,文件加的深度增加的时候
  137. ,它的孩子的结构信息也会
  138.                 //增加,如果不是最后一个孩子,则结构信息需加上"│"。
  139.                 showTree(children[i].root,childLeftStr+"│""├");
  140.             }
  141.             //最后一个孩子需要特殊处理
  142.             //打印结构信息
  143.             System.out.print(childLeftStr);
  144.             //如果是最后一个孩子,则结构信息需加上" "。
  145.             //结点形状也调整为"└"
  146.             showTree(children[files.length-1].root, childLeftStr+" ","└");
  147.         }
  148.     }
  149.     public static void main(String[] args) {
  150.         File f = new File("C://test");
  151.         Tree t = new Tree(f);
  152.         t.showTree(f,"""");
  153.     }
  154. }
原创粉丝点击