黑马程序员技术交流社区
标题:
关于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
哎,想了半天也期待了半天 还是没人解惑,我自己想了下 表达下意思,若有不足请改正谢谢
<P> import java.io.*;</P>
<P>class GetAllFiles
{
//打印输出方法
public static void sop(Object obj)
{
System.out.println(obj);
}</P>
<P> public static void main(String[] args)
{
//封装文件对象
File fl = new File("F:"+File.separator+"音乐2");
getFiles(fl,0);
}
public static String getLevel(int num)
{</P>
<P>//给我多少个层次我就打印几个,这个方法目的就是根据层级来打印多少个“|———”。</P>
<P>//通过临时存储方法来添加输出那个引号里的符号长度,再转字符串return;</P>
<P>//有一点,最后return可不可以变直接sop()呢?
StringBuilder sb = new StringBuilder();
for(int x = 0;x<num;x++)
{
sb.append("|___");
}
return sb.toString();
}
public static void getFiles(File fl,int num)//接受两变量,
{
sop(getLevel(num)+fl.getName());//根据层级打印num即“|———”和文件对象名称
num++;//每打印一次或每递归一次之前自增一次;
//返回路径数组
File[] str = fl.listFiles();
//遍历数组
for (int x = 0;x<str.length ;x++ )
{
//如果遍历到的文件是目录就递归
if(str[x].isDirectory())
getFiles(str[x],num);//
else
sop(getLevel(num)+str[x]);//根据层级打印num即“|———”和文件对象名称。</P>
<P> }
}</P>
复制代码
吐槽:这网络实在没法说了,这回复我不知道啥时候能验证过关。吐血中。。。
作者:
Jim-剣◆﹏
时间:
2013-10-24 00:31
<p> public static String getLevel(int level)
{
StringBuilder sb=new StringBuilder();
for(int i=0;i<level;i++)
sb.append(" ");//把一段固定大小的空字符存入StringBuilder里
//第一次传入0时,StringBuilder的长度为0,返回null
return sb.toString();
}
public static void showDir(File dir,int level)//level有个初始值0,遍历目录,传入一个路径,和初始level //在showDir()里怎么实现也不大清楚了
{/*此时level=0,首先调用getLevel(0),请看上面,然后在打印的目录的绝对路径前面什么也不加,如果是传入
level=1,那么就在绝对路径前加上一段“ ”,如果是level=2,那么加“ ”,以此类推...不说你也懂
*/
sop(getLevel(level)+dir);
level++;//打印完后level+1,至于为什么要加1,因为第一个遍历的是一个最顶层的目录,所以没有和最顶层的平级的目录了,所以接下来遍历的就是这个顶层目录里的文件了,所以要+1分级
File[] files=dir.listFiles();//得到dir目录里面的所有目录和文件的路径
for(File file:files)
{
if(file.isDirectory())//判断这一个文件是否是目录
showDir(file,level);//如果是,那么就将这个文件作为一个最顶层的目录,递归调用,进去该目录里面再遍历
else
sop(getLevel(level)+file);//如果不是目录,那就是文件了,直接打印该文件的路径就对了
//此时的level已经是1了,所以前面要有一段“ ”
}
}
}
//A(0)-----
|
|
|
B(1)-----c(2)
|
|
|
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