Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2016, 17:16   #1
inkognitik
 
Регистрация: 14.12.2015
Сообщений: 8
Восклицание Поиск по содержанию файлОВ

Дан ког, как сделать,что бы поиск осуществлялся по содержанию файлов, а не по имени?
Код:
package searchtools;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class FileFinder {
    
    //классы для работы с регулярными выражениями
    private Pattern p = null;
    private Matcher m = null;
    
    //общий размер найденных файлов
    private long totalLength = 0;
    //общее количество найденных файлов
    private long filesNumber = 0;
    //общее количество просмотренных директорий
    private long directoriesNumber = 0;
    
    //константы для определения объектов, которые нужно найти
    private final int FILES = 0;
    private final int DIRECTORIES = 1;
    private final int ALL = 2;
    
    //список с объектами, которые должны быть уведомлены о состоянии поиска
    private List listeners = null;
    //используется для остановки поиска
    private boolean stop = false;
    
    /** Создает новые экземпляры FileFinder */
    public FileFinder() {
    }
    public List findAll(String startPath) throws Exception {
        return find(startPath, "", ALL);
    }


    public List findAll(String startPath, String mask)
            throws Exception {
        return find(startPath, mask, ALL);
    }


    public List findFiles(String startPath)
            throws Exception {
        return find(startPath, "", FILES);
    }


    public List findFiles(String startPath, String mask)
            throws Exception {
        return find(startPath, mask, FILES);
    }

  
    public List findDirectories(String startPath)
            throws Exception {
        return find(startPath, "", DIRECTORIES);
    }

 
    public List findDirectories(String startPath, String mask)
            throws Exception {
        return find(startPath, mask, DIRECTORIES);
    }

    public long getDirectorySize() {
        return totalLength;
    }
    
  
    public long getFilesNumber() {
        return filesNumber;
    }
    

    public long getDirectoriesNumber() {
        return directoriesNumber;
    }
    

    private boolean accept(String name) {
        //если регулярное выражение не задано...
        if(p == null) {
            //...значит объект подходит
            return true;
        }
        //создаем Matcher
        m = p.matcher(name);
        //выполняем проверку
        if(m.matches()) {
            return true;
        }
        else {
            return false;
        }
    }
    
    /*
    Этот метод выполняет начальные установки поиска.
    Затем вызывает метод search для выполнения поиска.
    */
    private List find(String startPath, String mask, int objectType)
            throws Exception {
        //сбрасываем переменную стоп, т.к. она могла быть установлена
        //в true после остановки предыдущего поиска
        stop = false;
        //проверка параметров
        if(startPath == null || mask == null) {
            throw new Exception("Ошибка: не заданы параметры поиска");
        }
        File topDirectory = new File(startPath);
        if(!topDirectory.exists()) {
            throw new Exception("Ошибка: указанный путь не существует");
        }
        //если задано регулярное выражение, создаем Pattern
        if(!mask.equals("")) {
            p = Pattern.compile(mask,
                    Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
        }
        //обнуляем все счетчики
        filesNumber = 0;
        directoriesNumber = 0;
        totalLength = 0;
        //создаем список результатов
        ArrayList res = new ArrayList(100);
        
        //уведомляем все зарегистрированные (с помощью метода addListener)
        //объекты о начале поиска
        if(listeners != null) {
            for(int i = 0; i < listeners.size(); i++) {
                ((SearchListener)listeners.get(i)).onSearchStart();
            }
        }
        
        //выполняем поиск
        search(topDirectory, res, objectType);
        
        //уведомляем все зарегистрированные (с помощью метода addListener)
        //объекты о завершении поиска
        if(listeners != null) {
            for(int i = 0; i < listeners.size(); i++) {
                ((SearchListener)listeners.get(i)).onSearchEnd();
            }
        }

        //присваиваем null шаблону, т.к. при следующем вызове find...
        //регулярное выражение может быть не задано
        p = null;
        //возвращаем результат
        return res;
    }
    
    /*
    Этот метод выполняет поиск объектов заданного типа.
    Если, в процессе поиска, встречает вложенную директорию
    (папку), то рекурсивно вызывает сам себя.
    Результаты поиска сохраняются в параметре res.
    Текущая директория - topDirectory.
    Тип объекта (файл или директория) - objectType.
    */
    private void search(File topDirectory, List res, int objectType) {
        //если нужно остановить поиск...
        if(stop == true) {
            //... выходим
            return;
        }
        //уведомляем все зарегистрированные (с помощью метода addListener)
        //объекты о состоянии процесса поиска
        if(listeners != null) {
            for(int i = 0; i < listeners.size(); i++) {
                ((SearchListener)listeners.get(i)).onSearchProgressChange(
                        totalLength, filesNumber, directoriesNumber);
            }
        }
        //получаем список всех объектов в текущей директории
        File[] list = topDirectory.listFiles();
        //просматриваем все объекты по-очереди
        for(int i = 0; i < list.length; i++) {
            //если это директория (папка)...
            if(list[i].isDirectory()) {
                //...выполняем проверку на соответствие типу объекта
                // и регулярному выражению...
                if(objectType != FILES && accept(list[i].getName())) {
                    //...добавляем текущий объект в список результатов,
                    //и обновляем значения счетчиков
                    directoriesNumber++;
                    res.add(list[i]);
                }
                //выполняем поиск во вложенных директориях
                search(list[i], res, objectType);
            }
            //если это файл
            else {
                //...выполняем проверку на соответствие типу объекта
                // и регулярному выражению...
                if(objectType != DIRECTORIES && accept(list[i].getName())) {
                    //...добавляем текущий объект в список результатов,
                    //и обновляем значения счетчиков
                    filesNumber++;
                    totalLength += list[i].length();
                    res.add(list[i]);
                }
            }
        }
    }

    /**
     * Этот метод преденазначен для добавления объекта, который нужно
     * уведемлять о состоянии процесса поиска
     */
    public void addListener(SearchListener listener) {
        //Если список объектов не создан, то создаем его
        if(listeners == null) {
            //начальный размер устанавливаем равным единице, т.к. во
            //многих случаях добавляется только один объект
            listeners = new ArrayList(1);
        }
        //добавляем объект
        listeners.add(listener);
    }
    
    /**
     * Этот метод останавливает процесс поиска
     */
    public void stopSearch() {
        stop = true;
    }
}
inkognitik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как реализовать "Поиск по содержанию документа в папке" de2street C# (си шарп) 1 14.09.2015 11:39
Вставка картинки соответствующей содержанию ячейки Cipariz Microsoft Office Excel 1 03.03.2014 18:12
Поиск файлов по маске и нахождения общего размера найденных файлов и вывод в терминал Колямбий Помощь студентам 0 21.04.2013 21:31
Помогите сделать поиск названия книги, по её содержанию ... HAMMAN Помощь студентам 10 01.05.2009 04:46
Помогите сделать поиск по содержанию HAMMAN Помощь студентам 2 06.02.2009 20:11