Java文件列表显示
要求:从终端获取文件夹的路径,递归的显示文件夹下面所有的文件夹以及文件。
思路:给定一个文件夹,文件夹下面有文件夹或者文件,怎样用缩进的方式把它显示出来是我们的目标,为了达成这个目标,需要考虑以下几个问题。
- 怎样获得文件夹下面的文件信息;
- 怎么判断一个文件属于文件夹还是文件;
- 利用什么样的数据结构能够使文件按照列表进行显示;
第一点:很明显,JDK下的java.io.File类提供了接口供我们调用:
第二点:仔细观察File类为我们提供的接口,我们会很幸运的发现有如下接口:
可以发现,第一点第二点很简单的得到了解决。
第三点:也是我们的重点和难点,我们的要求是按照列表的顺序显示所有文件,按照这个思想,理所当然的我们会想到队列是一个不错的选择,而文件夹下面可能还有文件,函数用递归方式书写又是一个方案。
如下图所示是我们文件的组织方式,其中正常矩形表示文件夹,圆角矩形表示一个文件:
算法思想:
Step1: 获取文件夹名字并定义一个队列获取文件夹名字下的所有文件名
ResizingArrayQueue<String> fileQueue = new ResizingArrayQueue<String>();
File file = new File(filePath);
File[] FileListTest = file.listFiles();
for(int j = 0;j<FileListTest.length;j++)
{
fileQueue.enqueue(FileListTest[j].toString());
}
其中
ResizingArrayQueue<String> fileQueue = new ResizingArrayQueue<String>();
表示的是New一个队列,队列中的元素是String类型,也就是我们文件或者文件夹的名字,队列的具体实现方式略。
将文件夹名字下的文件或者文件夹获得以后,就该输出显示了,根据要求,我们要一个一个的将队列中的文件显示出来,为了以缩进的方式表示文件与文件夹之间的关系,我们可以通过文件的路径判断它属于第几层.
假设我给出的文件夹名字是MathType,MathType下的文件信息如下:
输出队列中的文件信息可以发现如下输出信息:
MathType\1.1
MathType\1.2
MathType\1.3.exe
MathType\1.4.chm
MathType\1.5.exe
根据输出信息我们可以根据文件路径来决定输出多少空格来缩进文件夹之间的父子关系,这个可以很简单的用String类中Spilt方法实现。
String[] filepsthLength = FileListTest[j].toString().split("\\\\");//判断文件夹路径长度
int length = filepsthLength.length;
if(length>2)
for(int k = 2;k<length;k++)
System.out.print(" ");
注意:length大于2才输出空格的原因是保证MathType下的文件或者文件夹前没有空格。
接下来很简单的会想到要输出队列中的第一个文件:
System.out.println(filepsthLength[length-1]);
输出以后,还要判断该文件是不是属于文件夹,如果是的话需要将文件夹下面的文件输出,这又回到了最初的阶段,这里递归就用上了:
if(*FileListTest[j].isFile() == false*)
readFile(FileListTest[j].toString());
假设文件列表显示函数名为readFile.
注意红色部分表示文件夹判断,如果为false表示不是一个文件而是一个文件夹,需要将该文件夹下的文件输出,指导最里面一层,然后返回,接着输出最外层文件信息的下一个文件。
以上就是该算法的思想,下面贴上代码:
核心算法:
import java.io.File;
/**
* 文件列表
* @author KK
* 从命令行接受一个文件夹的名字作为 参数,打印出该文件夹下的所有文件并用递归的方式在所有子文件的名下(缩进)
* 列出其下的所有文件
*/
public class fileList {
public static void readFile(String filePath)
{
ResizingArrayQueue<String> fileQueue = new ResizingArrayQueue<String>();
File file = new File(filePath);
File[] FileListTest = file.listFiles();
for(int j = 0;j<FileListTest.length;j++)
{
fileQueue.enqueue(FileListTest[j].toString());
}
for(int j= 0;j<FileListTest.length;j++)
{
// System.out.println(FileListTest[j].toString());
String[] filepsthLength = FileListTest[j].toString().split("\\\\");//判断文件夹路径长度
int length = filepsthLength.length;
if(length>2)
for(int k = 2;k<length;k++)
System.out.print(" ");
System.out.println(filepsthLength[length-1]);
if(FileListTest[j].isFile() == false)
readFile(FileListTest[j].toString());
}
}
}
结果测试: