Создание приложения для поиска файлов на Java

18 августа, 2007

Тестирование и использование класса поиска

Класс для поиска мы написали. Теперь нужно проверить, как он работает. Для этого, создадим папку с такой структурой:

    folderForTests
          folder1
                emptyFolder
                file11.txt
          folder2
                file22.html
                file21.txt
          file1.txt
          file2.txt

И напишем тесты для проверки работы каждого метода. Тесты создадим с использованием библиотеки JUnit. Описывать использование этой библиотеки я не буду. Это не тема данной статьи, к тому же, подробные инструкции можно найти на официальном сайте этой библиотеки.

Сами тесты достаточно простые. Идея такая, мы используем наш класс для анализа созданной папки, и проверяем результаты.

Полностью класс тестов можно посмотреть в исходниках, а здесь я покажу только его фрагмент:

/*Задаем папку для поиска*/
String startPath = "folderForTests";
/*Создаем экземпляр класса поиска*/
FileFinder finder = new FileFinder();
/*Начинаем поиск*/
List result = finder.findAll(startPath);
/*Проверяем общее количество найденных объектов*/
assertEquals(result.size(), 8);
/*Проверяем общий размер всех файлов в папке*/
assertEquals(finder.getDirectorySize(), 209);
/*Проверяем количество найденных папок*/
assertEquals(finder.getDirectoriesNumber(), 3);
/*Проверяем количество найденных файлов*/
assertEquals(finder.getFilesNumber(), 5);

Использование нашего класса в программе ничуть не сложнее, чем использование любого другого класса. В первую очередь, импортируем класс.
import searchtools.FileFinder;
Затем создаем экземпляр класса, и вызываем нужный метод. Например,

FileFinder finder = new FileFinder();
try {
    List res = finder.findAll("имя_папки");
}
catch(Exception err) {
    System.out.println(err.getMessage());
}

Посмотреть свойства найденных объектов тоже не сложно (мы имеем список с объектами типа File, и можем использовать любой метод этого класса).

В качестве примера напишем консольную программу, которая выводит список найденных файлов с указанием их размера. Папка для поиска и регулярные выражения задаются в параметрах командной строки.

import java.io.File;
import java.util.List;
import searchtools.FileFinder;

/**
 * Программа поиска файлов
 * Параметры поиска:
 * 1 - начальная директория (папка) поиска
 * 2 - регулярное выражение (необязательный)
 * Например:
 * java -jar FileSearchProgram.jar C:junit3.8.1
 * java -jar FileSearchProgram.jar C:junit3.8.1 .*.html
 *
 * @author Стаценко Владимир
 * http://www.vova-prog.narod.ru
 */
public class Main {

    /** Создает экземпляры Main */
    public Main() {
    }

    /**
     * @param args[0] начальная директория (папка) поиска
     * @param args[1] регулярное выражение
     */
    public static void main(String[] args) {
        //проверяем, заданы ли параметры поиска
        if(args != null && args.length >= 1) {
            FileFinder finder = new FileFinder();
            try {
                List searchRes = null;
                //если задано регулярное выражение...
                if(args.length == 2) {
                    //...ищем только соответствующие объекты
                    searchRes = finder.findAll(args[0], args[1]);
                }
                //если нет...
                else {
                    //...ищем все подряд
                    searchRes = finder.findAll(args[0]);
                }
                //выводим результаты
                for(int i = 0; i < searchRes.size(); i++) {
                    File curObject = (File)searchRes.get(i);
                    if(curObject.isDirectory()) {
                        System.out.println(
                                curObject.getName() + " (папка)");
                    }
                    else {
                        System.out.println(curObject.getName()
                                + " (" + curObject.length() + " байт)");
                    }
                }
                System.out.println("Найдено " + finder.getFilesNumber() +
                        " файлов и " + finder.getDirectoriesNumber() +
                        " папок.");
            }
            catch(Exception err) {
                System.out.println(err.getMessage());
            }
        }
        else {
            System.out.println("Не заданы параметры поиска.n" +
                    "начальная_папка <регулярное_выражение>n");
        }
    }
}

Скачать:

исходники класса поиска с тестами (FileFinding_src.zip – 12 кБ)

исходники программы поиска (FileSearchProgram_src.zip – 9 кБ)

консольную программу поиска (fileSearchProgram.zip – 4 кБ)

Постовой

Широкий выбор авто в Одессе. Лучшие цены на Chery в Одессе

Страницы: 1 2

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в Java Комментарии (12) »

]]>

Вы можете оставить комментарий. Трекбеки закрыты.

  • Андрей

    Спасибо! Этот класс мне очень помог! Есть одно замечание:
    в методе search
    в строке File[] list = topDirectory.listFiles();
    list может принять значение null (если доступ к папке запрещен) и далее программа генерирует ошибку, поэтому после указанной строки необходимо, судя по всему, вставить проверку на null: что то вроде этого: if (list == null){
    list = new File[]{};
    }

  • Андрей

    Спасибо! Этот класс мне очень помог! Есть одно замечание:
    в методе search
    в строке File[] list = topDirectory.listFiles();
    list может принять значение null (если доступ к папке запрещен) и далее программа генерирует ошибку, поэтому после указанной строки необходимо, судя по всему, вставить проверку на null: что то вроде этого: if (list == null){
    list = new File[]{};
    }

  • http://www.simplecoding.org/ Владимир

    Согласен. Действительно, пропустил этот момент.
    Просто тестировал только под Windows и с админовскими правами. Поэтому закрытых папок не было в принципе.
    По-моему, в такой ситуации лучше просто прервать выполнение:
    if (list == null) {
    return;
    }

    Ну и, конечно, можно генерировать исключение (все зависит от требований к программе)
    if (list == null) {
    throw new Exception("....");
    }

  • http://www.simplecoding.org/ Владимир

    Согласен. Действительно, пропустил этот момент.
    Просто тестировал только под Windows и с админовскими правами. Поэтому закрытых папок не было в принципе.
    По-моему, в такой ситуации лучше просто прервать выполнение:
    if (list == null) {
    return;
    }

    Ну и, конечно, можно генерировать исключение (все зависит от требований к программе)
    if (list == null) {
    throw new Exception("....");
    }

  • Максим

    Спасибо. Очень хорошо все расписал, приятно читать.

  • Максим

    Спасибо. Очень хорошо все расписал, приятно читать.

  • Тарас

    классная статья,спасибо

  • Тарас

    классная статья,спасибо

  • Alex

    А можно ли было воспользоваться
    private class FindFilenameFilter implements FilenameFilter {
    Pattern p = null;
    Matcher m = null;

    SourceFilenameFilter(String mask) {
    p = Pattern.compile(mask);
    }

    public boolean accept (File f, String s ) {

    m = p.matcher(s);
    if(m.matches()) {
    return true;
    }
    return false;
    }
    }
    и потом в search
    File[] list = topDirectory.listFiles(new FindFilenameFilter(mask));
    ?

    • http://www.simplecoding.org/ Владимир

      Наверное можно, если результат подходит :)

      Если серьезно, я хотел показать пример использования рекурсии. Естественно, использовать готовую библиотеку проще и удобнее. Просто не для всех случаев существуют эти библиотеки.

  • Alex

    А можно ли было воспользоваться
    private class FindFilenameFilter implements FilenameFilter {
    Pattern p = null;
    Matcher m = null;

    SourceFilenameFilter(String mask) {
    p = Pattern.compile(mask);
    }

    public boolean accept (File f, String s ) {

    m = p.matcher(s);
    if(m.matches()) {
    return true;
    }
    return false;
    }
    }
    и потом в search
    File[] list = topDirectory.listFiles(new FindFilenameFilter(mask));
    ?

    • http://www.simplecoding.org/ Владимир

      Наверное можно, если результат подходит :)

      Если серьезно, я хотел показать пример использования рекурсии. Естественно, использовать готовую библиотеку проще и удобнее. Просто не для всех случаев существуют эти библиотеки.

]]>
Tweet