使用迭代算法进行本地文件搜索

时间:2011-12-19 18:40:03

标签: java graph io iteration

我正在使用Java的Windows桌面应用程序中工作。在我的应用程序中,需要搜索所有.php。为此,

这里我使用递归方法

import java.io.File;

public class Copier {

    public static void find(String source,String rep) {
        File src = new File(rep);
        if (src!= null && src.exists() && src.isDirectory()) {
            String[] tab = src.list();
            if (tab != null) {
                for(String s : tab) {
                    File srcc = new File(rep+"\\"+s);
                    if (srcc.isFile()) {  
                        if (srcc.getName().matches(".*"+source+"$")) {
                            System.out.println(s);
                        }
                    } else {
                        find(source,srcc.getAbsolutePath());
                    }
                }
            } else {
                //System.out.println(" list is null");
            }
        }
    }

这里我使用迭代算法与广度优先搜索队列但不起作用

import java.io.File;
import java.util.LinkedList;


public class Copier {
public static void find(String source,String rep)
{
    File src=new File(rep);
    LinkedList<File> qu=new LinkedList();
    if(src!=null && src.exists() && src.isDirectory())
    {
        File[] tab=src.listFiles();
        if(tab!=null)
        {
        for(File s:tab)
        {
            qu.addLast(s);
        }
        while(!qu.isEmpty())
        {
            File srcc=qu.getFirst();
            qu.removeFirst();
            if(srcc.isFile())
            {
                if(srcc.getName().matches(".*"+source+"$"))
                    System.out.println(srcc.getName());
            }

            else
            {
                System.out.println(srcc.getName());
                qu.addLast(srcc);
            }
        }

        }
    }
}

public static void main(String[] args)
{
        try {
            find(".php","C:\\AppServ");
        } catch (Exception e) {
            e.printStackTrace();
        }

}
}

2 个答案:

答案 0 :(得分:1)

阿努阿尔,

尝试使用Apache Commons IO 您可以使用描述为here in API Javadoc的班级

org.apache.commons.io.FileUtils

它提供了非常有用,性能优化且无错误的静态方法来搜索文件(listFiles和iterateFiles方法),复制/移动文件和目录,在“一行代码”中读取文件到String更好的东西。

没有必要重新发明轮子;)

答案 1 :(得分:0)

您应该尝试不对第一个文件夹/路径和子文件夹产生影响。瑜伽正在做的是从src文件夹中获取所有文件和文件夹并将它们添加到队列中。然后删除第一个并检查它是否是文件。如果是,则如果它与您打印的图案匹配。如果它不是文件,则打印名称并再次将其添加到队列中!

想一想。如果您的src文件夹包含一个文件夹,您将其从队列中取出,将其重新添加并重复,直到队列为空(当然它永远不会出现)。

你需要更像这样的东西

public static void find(String source,String rep) {
    String pattern = ".*"+source+"$";
    LinkedList<File> qu = new LinkedList<File>();
    File src = new File(rep);
    qu.add(src);
    while(!qu.isEmpty()) {
        File srcc = qu.removeFirst();

        if(srcc!=null && srcc.exists()) {
            if (srcc.isDirectory()) {
                File[] tab=srcc.listFiles();
                for(File s: srcc.listFiles()) {
                    qu.addLast(s);
                }
            } else if (srcc.isFile()) {
                if(srcc.getName().matches(pattern)) {
                    System.out.println(srcc.getName());
                }
            }
        }
    }
}

如果当前文件是目录,则将所有子文件添加到队列中,如果是文件,则检查名称是否匹配。