黑马程序员技术交流社区

标题: 关于IO流列出所有目录的文件且要分层次的疑问 [打印本页]

作者: ☆星痕泪    时间: 2013-10-23 21:16
标题: 关于IO流列出所有目录的文件且要分层次的疑问
本帖最后由 ☆星痕泪 于 2013-10-24 19:10 编辑

如题,老师说这个是带着玩一下,但是里面为什么用这个方法却不懂了,看一下代码
*
        列出目录下所有内容且带有层次
*/
import java.io.*;

class GetAllFiles
{
        //打印输出方法
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }

        public static void main(String[] args)
        {
                //封装文件对象
                File fl = new File("F:"+File.separator+"音乐2");
                getFiles(fl);
        }
        public static void getFiles(File fl)
        {
                sop(fl);
                //返回路径数组
                File[] str = fl.listFiles();
                //遍历数组
                for (int x = 0;x<str.length ;x++ )
                {
                        //如果遍历到的文件是目录就递归
                        if(str[x].isDirectory())
                                getFiles(str[x]);
                        else
                                sop(str[x]);
                }
        }
//---------------------------------------------------
//以上是我没有分层次的,下面是老师的代码
//这是我纠结的地方啊,望高手讲哈原理,谢谢啦

         public static String getLevel(int level)//这个getLevel()方法究竟是怎么让分层的?原理不大懂
     {
         StringBuilder sb=new StringBuilder();
         for(int i=0;i<level;i++)
            sb.append("    ");
            return sb.toString();
     }
      public static void showDir(File dir,int level)//因为前面那个方法没清楚,后面关于int level
                                                                                                        //在showDir()里怎么实现也不大清楚了
      {
          sop(getLevel(level)+dir);
          level++;
          File[] files=dir.listFiles();
          for(File file:files)
             {
              if(file.isDirectory())
             showDir(file,level);
             else
           sop(getLevel(level)+file);
      }

   }
}
作者: ☆星痕泪    时间: 2013-10-23 22:19
哎,想了半天也期待了半天 还是没人解惑,我自己想了下 表达下意思,若有不足请改正谢谢

  1. <P> import java.io.*;</P>
  2. <P>class GetAllFiles
  3. {
  4. //打印输出方法
  5. public static void sop(Object obj)
  6. {
  7.   System.out.println(obj);
  8. }</P>
  9. <P> public static void main(String[] args)
  10. {
  11.   //封装文件对象
  12.   File fl = new File("F:"+File.separator+"音乐2");
  13.   getFiles(fl,0);
  14. }
  15. public static String getLevel(int num)
  16. {</P>
  17. <P>//给我多少个层次我就打印几个,这个方法目的就是根据层级来打印多少个“|———”。</P>
  18. <P>//通过临时存储方法来添加输出那个引号里的符号长度,再转字符串return;</P>
  19. <P>//有一点,最后return可不可以变直接sop()呢?
  20.   StringBuilder sb = new StringBuilder();
  21.   for(int x = 0;x<num;x++)
  22.   {
  23.    sb.append("|___");
  24.   }
  25.   return sb.toString();
  26. }
  27. public static void getFiles(File fl,int num)//接受两变量,
  28. {
  29.   sop(getLevel(num)+fl.getName());//根据层级打印num即“|———”和文件对象名称
  30.   num++;//每打印一次或每递归一次之前自增一次;
  31.   //返回路径数组
  32.   File[] str = fl.listFiles();
  33.   //遍历数组
  34.   for (int x = 0;x<str.length ;x++ )
  35.   {
  36.    //如果遍历到的文件是目录就递归
  37.    if(str[x].isDirectory())
  38.     getFiles(str[x],num);//
  39.    else
  40.     sop(getLevel(num)+str[x]);//根据层级打印num即“|———”和文件对象名称。</P>
  41. <P> }
  42. }</P>
复制代码
吐槽:这网络实在没法说了,这回复我不知道啥时候能验证过关。吐血中。。。


作者: Jim-剣◆﹏    时间: 2013-10-24 00:31
  1. <p> public static String getLevel(int level)
  2.      {
  3.           StringBuilder sb=new StringBuilder();
  4.           for(int i=0;i<level;i++)
  5.              sb.append("    ");//把一段固定大小的空字符存入StringBuilder里
  6.                   //第一次传入0时,StringBuilder的长度为0,返回null
  7.              return sb.toString();
  8.       }
  9.        public static void showDir(File dir,int level)//level有个初始值0,遍历目录,传入一个路径,和初始level                                                                                          //在showDir()里怎么实现也不大清楚了
  10.       {/*此时level=0,首先调用getLevel(0),请看上面,然后在打印的目录的绝对路径前面什么也不加,如果是传入
  11.           level=1,那么就在绝对路径前加上一段“    ”,如果是level=2,那么加“        ”,以此类推...不说你也懂
  12.           */
  13.            sop(getLevel(level)+dir);
  14.            level++;//打印完后level+1,至于为什么要加1,因为第一个遍历的是一个最顶层的目录,所以没有和最顶层的平级的目录了,所以接下来遍历的就是这个顶层目录里的文件了,所以要+1分级
  15.            File[] files=dir.listFiles();//得到dir目录里面的所有目录和文件的路径
  16.            for(File file:files)
  17.               {
  18.                if(file.isDirectory())//判断这一个文件是否是目录
  19.               showDir(file,level);//如果是,那么就将这个文件作为一个最顶层的目录,递归调用,进去该目录里面再遍历
  20.               else
  21.             sop(getLevel(level)+file);//如果不是目录,那就是文件了,直接打印该文件的路径就对了
  22.                           //此时的level已经是1了,所以前面要有一段“    ”
  23.        }

  24.     }
  25. }
  26. //A(0)-----
  27.             |
  28.                         |
  29.                         |
  30.                         B(1)-----c(2)
  31.                                         |
  32.                                         |
  33.                                         |
  34.                                 E(2)</p><p> </p>
复制代码
这也挺难说得明白,最好能画画图,上图的数字是LEVEL的值

作者: ☆星痕泪    时间: 2013-10-24 19:09
Jim-剣◆﹏ 发表于 2013-10-24 00:31
这也挺难说得明白,最好能画画图,上图的数字是LEVEL的值

O(∩_∩)O~,谢谢。刚下班回家
作者: ☆星痕泪    时间: 2013-10-24 19:18
Jim-剣◆﹏ 发表于 2013-10-24 00:31
这也挺难说得明白,最好能画画图,上图的数字是LEVEL的值

仔细看了,说的非常细。之前自己理解些但是就是表达不出来,茅塞顿开,灰常感谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2