永发信息网

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

答案:3  悬赏:50  手机版
解决时间 2021-02-08 10:33
  • 提问者网友:欲劫无渡
  • 2021-02-07 15:04
说明:
递归读取文件名,组装成html标签,并封装到StringBuffer中,
最后输出到前台界面,展示出Tree样式。

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

请问:有什么优化策略?

public static String create(String dir) {

private static void saveXmlTree(File file,StringBuffer s) {

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

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

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

    if(subs[i].listFiles()!=null){
    s.append("");
    }else{
    s.append("");
    }
    s.append(subs[i].getName());
    s.append("");

    saveXmlTree(subs[i],s);
    s.append("
  • ");
    }
    s.append("
");
}
最佳答案
  • 五星知识达人网友:duile
  • 2021-02-07 16:05
感觉主要subs[i].listFiles()调用比较花时间,
不知道你用subs[i].listFiles()!=null这个判断的目的是什么,
如果替换成subs[i].exist或者isDirectory不知道符合不符合你的要求,
要是符合的话最好换了吧。
如果实在不能替换的话,至少可以定义一个变量保存它的结果,这样每次递归可以少调一次,能节省不少时间呢。

还有一点,把所有东西都放到StringBuffer s中也会是一个瓶颈,
最好是StringBuffer中的数据达到一定长度的时候就把它输出到其他的地方,
比如文件。
全部回答
  • 1楼网友:孤老序
  • 2021-02-07 16:44
补充,当文件系统成为往事的时候,使用tar格式的文件系统会比较好。 网上有一个关于apache commons tar格式文件和文件系统访问的benchmark 再看看别人怎么说的。
  • 2楼网友:woshuo
  • 2021-02-07 16:39
楼主的问题在几个星期前我也想在这里提交。 我在几个月前写的一个递归读取一个文件夹下面的所有子文件夹。 情况是这样的: 当前文件夹: e:\图片\ 下面有几十个多级子文件夹,每个文件夹里有5千张图片。 通过递归的方法,显示e:\图片\下的所有子文件夹结构,需要8 - 15分钟。 这个速度让人无法接受。 我查了一下原因,时间主要在 file.listFile()和isDirectory()是消耗掉了。 因为只有几十个子文件夹,但是在JAVA里要对比几十万张图片,这个对比图片的操作太费时间了,我一时也找不到更好的办法。 如果 file.listFile()如果能单独列出文件夹就好了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯