java File类,递归读取本地目录,速度特别慢。

说明:
递归读取文件名,组装成html标签,并封装到StringBuffer中,
最后输出到前台界面,展示出Tree样式。

问题:展示到前台时,目录比较深的话,速度非常之慢。

请问:有什么优化策略?

public static String create(String dir) {
/**
* 递归建树
* @param file
* @param s
*/
private static void saveXmlTree(File file,StringBuffer s) {

if (file == null || !file.exists()) {
return ;
}

File[] subs = file.listFiles();
if(subs==null) return;

s.append("<UL>");
for (int i = 0; i < subs.length; i++) {
s.append("<li ");
if(subs[i].listFiles()!=null){
s.append("class=\"closed\"");
}
s.append(">");

if(subs[i].listFiles()!=null){
s.append("<span class=\"folder\">");
}else{
s.append("<span class=\"file\">");
}
s.append(subs[i].getName());
s.append("</span>");

saveXmlTree(subs[i],s);
s.append("</li>");
}
s.append("</UL>");
}

感觉主要subs[i].listFiles()调用比较花时间,
不知道你用subs[i].listFiles()!=null这个判断的目的是什么,
如果替换成subs[i].exist或者isDirectory不知道符合不符合你的要求,
要是符合的话最好换了吧。
如果实在不能替换的话,至少可以定义一个变量保存它的结果,这样每次递归可以少调一次,能节省不少时间呢。

还有一点,把所有东西都放到StringBuffer s中也会是一个瓶颈,
最好是StringBuffer中的数据达到一定长度的时候就把它输出到其他的地方,
比如文件。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-09-06
楼主的问题在几个星期前我也想在这里提交。

我在几个月前写的一个递归读取一个文件夹下面的所有子文件夹。
情况是这样的:

当前文件夹:
e:\图片\

下面有几十个多级子文件夹,每个文件夹里有5千张图片。

通过递归的方法,显示e:\图片\下的所有子文件夹结构,需要8 - 15分钟。
这个速度让人无法接受。

我查了一下原因,时间主要在 file.listFile()和isDirectory()是消耗掉了。

因为只有几十个子文件夹,但是在JAVA里要对比几十万张图片,这个对比图片的操作太费时间了,我一时也找不到更好的办法。

如果 file.listFile()如果能单独列出文件夹就好了。
第2个回答  2009-09-06
补充,当文件系统成为往事的时候,使用tar格式的文件系统会比较好。
网上有一个关于apache commons tar格式文件和文件系统访问的benchmark
相似回答