练习:给定任意一个目录,以树形方式展现出该目录中的子目录和文件。另外,在展现目录的时候将目录排在上面,文件排在下面。每一层要加上缩进。
package com.io2;
import java.io.File;
import java.util.ArrayList;
public class ListAllTest
{
private static int time;//用户判断目录或者文件所处的层次。
//递归的方法
public static void deepList(File file)//file表示用户传递进来的想要显示的目录结构被人
{
//递归肯定需要一个出口:如果遍历到是文件或者空文件夹,就是出口
if(file.isFile() || file.listFiles().length ==0)
{
return;
}
else
{
//得到文件和文件夹
File[] files=file.listFiles();
files=sort(files);//此时已经排完序
for(File f:files)
{
StringBuffer output=new StringBuffer();
if(f.isFile())
{
output.append(getTabs(time));
output.append(f.getName());
}
else
{
output.append(getTabs(time));
output.append(f.getName());
output.append("\\");
}
System.out.println(output);
if(f.isDirectory()){
time++;
deepList(f);
time--;
}
}
}
}
//整理文件数组,使得文件夹排在文件之前.
//接收一个File[] 数组,返回一个File[]数组
private static File[] sort(File[] files)
{
//使用集合排序
ArrayList<File> sorted=new ArrayList<File>();
//寻找到所有目录
for(File f: files)
{
if(f.isDirectory())
{
sorted.add(f);
}
}
//寻找到所有的文件
for(File f: files)
{
if(f.isFile())
{
sorted.add(f);
}
}
//将集合元素转换成数组元素
return sorted.toArray(new File[files.length]);
}
//判断需要加多少tab的方法
private static String getTabs(int time)
{
StringBuffer buffer=new StringBuffer();
for(int i=0;i<time;i++)
{
buffer.append("\t");
}
return buffer.toString();
}
public static void main(String[] args)
{
File file=new File("D:/Program Files (x86)");
deepList(file);//调用递归方法
}
}