Локальный поиск файлов с итерационным алгоритмом - PullRequest
1 голос
/ 19 декабря 2011

Я работаю в настольном приложении для Windows, используя Java. В моем приложении есть требование искать все .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 ]

1 голос
/ 20 декабря 2011

Ануар,

попробуйте использовать Apache Commons IO .
Вы можете использовать класс

org.apache.commons.io.FileUtils
, описанный здесь, в API Javadoc .

Он предоставляет очень полезные, оптимизированные для производительности и без ошибок статические методы для поиска файлов (методы listFiles и iterateFiles), копирования / перемещения файлов и каталогов, чтения файлов в String в виде «одной строки кода» и многих других. более приятные вещи.

Нет необходимости изобретать велосипед;)

0 голосов
/ 20 декабря 2011

Вы должны попытаться не делать различий с первой папкой / путем и подпапками.Йога сейчас занимается тем, что берет все файлы и папки из папки 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());
                }
            }
        }
    }
}

где, если текущий файл является каталогом, все подфайлы добавляются в очередь, а если это файл, имя проверяется на совпадение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...