8/18/2010

输出一个文件夹下的所有文件

以前就用java写过一个实现这种功能的类。
不过那个针对百万级别的数据就会耗费大量的时间进行初始化,因为那种实现的方式是一次将所有的子文件夹以及文件都载入到内存。
这次的思想是动态地进行载入,只有必要时才会去载入新的文件或文件夹。

现在这个版本只是个雏形,将最基础的功能进行了实现,以后会陆续加入文件个数统计,文件夹数目统计,文件类型过滤,以及中间结果储存目录树的构建等。

源代码如下,欢迎大家进行测试:


import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

class dir {
private int size;// 当前目录list的大小
private int index;// index

private String path;// 路径or文件名
private File file;
private dir[] dir;// 子文件or子目录
private String[] list;// 目录的list

dir(String s) {
// 保证path的末尾不带'';
if (s.lastIndexOf('\') == s.length() - 1)
s = s.substring(0, s.length() - 1);

this.path = s;
this.file = new File(this.path);
if (this.file.isDirectory()) {
this.list = this.file.list();
this.path = this.path + "\";
this.index = 0;
this.size = this.list.length;

if (this.size > 0) {
this.dir = new dir[this.size];
this.dir[index] = new dir(this.path + this.list[index]);
}
}
}

/*
* 是否还有文件
*/
public boolean hasNext() {
if (this.index < this.size) {
return true;
} else {
return false;
}
}

/*
* 下一个文件
*/
public String next() {
String result;
if (this.index >= size)
return null;
if (this.dir[index].isFile()) {
result = this.dir[index].toString();
this.push();
return result;
} else {
if (this.dir[index].hasNext()) {
result = this.dir[index].next();
if (result == null)
result = this.next();
return result;
} else {
if (this.push()) {
result = this.next();
if (result == null) {
result = this.next();
}
return result;
} else {
return null;
}
}
}
}

/*
* 对象自己是否是一个文件
*/
public boolean isFile() {
return this.file.isFile();
}

public String toString() {
return this.path;
}

/*
* 向前推进
*/
private boolean push() {
this.index++;
if (this.index < this.size) {
this.dir[this.index] = new dir(this.path + this.list[this.index]);
return true;
}
return false;
}
}

public class Test extends Exception
// implements FileOperation
{

public static void main(String[] args) {
final String PATH = "C:\123";
// final String PATH = "D:\My Documents";
// final String PATH =
// "D:\Program Files\eclipse\configuration\org.eclipse.ui.intro.universal";
// final String PATH = "D:\Program Files\eclipse";

long start = System.currentTimeMillis();
int i = 0;

dir d = new dir(PATH);
while (d.hasNext()) {
String temp = d.next();
if (temp != null) {
System.out.println(temp);
i++;
}
}

System.out.println("共" + i + "个文件!");

long end = System.currentTimeMillis();
System.out.println(end - start);
}
}