非遞歸方式
public static void noRecursion(File dir){
int fileNum=0,folderNum=0;
LinkedList<File> list=new LinkedList<File>();
if(dir.exists()){
if (null==dir.listFiles()){
return;
}
list.addAll(Arrays.asList(dir.listFiles()));
while(!list.isEmpty()){
File[] files = list.removeFirst().listFiles();
if(null==files){
continue;
}
for (File f:files) {
if (f.isDirectory()) {
System.out.println("文件夾:" + f.getAbsolutePath());
list.add(f);
folderNum++;
} else {
System.out.println("文件:" + f.getAbsolutePath());
fileNum++;
}
}
}
}else{
System.out.println("文件不存在!");
}
System.out.println("文件夾數量:" + folderNum + ",文件數量:" + fileNum);
}
遞歸方式
public static void showDir(File dir) {
if(dir.exists()){
//抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的文件和目錄。
File[] files = dir.listFiles();
if(null!=files){
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
showDir(files[i]);
} else {
System.out.println(files[i]);
}
}
}
}else{
System.out.println("文件不存在!");
}
}
性能比較
public static void main(String[] args) {
System.out.println("------------------------------------------遞歸開始--------------------------------------------------------");
long start = System.currentTimeMillis();
showDir(new File("D:\\IDEAProject\\helloMi"));
long end = System.currentTimeMillis();
long num1=end-start;
System.out.println("---------------------遞歸結束-----------------------");
System.out.println("-------------------- 非遞歸開始----------------------");
start=System.currentTimeMillis();
noRecursion(new File("D:\\IDEAProject\\helloMi"));
end=System.currentTimeMillis();
System.out.println("---------------------非遞歸結束----------------------");
long num2=end-start;
System.out.println("-------------------------遞歸用時:"+num1);
System.out.println("-------------------------非遞歸用時:"+num2);
}
結果:
-------------------------遞歸用時:18
-------------------------非遞歸用時:20