Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Выбор файлов
Простейший редактор текста
Копирование файлов UNICODE
Сохранение объекта Java в файле
Произвольные классы и файлы
Буферизация потоков
Разбор конфигура-
ционного файла

Работа с консолью
Работа с классом PrintWriter
Разбор строк класса String
Загрузка и просмотр изображений
Потоки в оперативной памяти
Конвейерные потоки
Комбинирование двух потоков
Комбинирование нескольких потоков
Поиск слова в текстовом файле
Произвольный доступ к файлу
Информация о файле
Работа с каталогами
Просмотр содержимого каталога
Просмотр каталога с фильтром
Панель для выбора каталога
Список системных свойств
Сохранение списка системных свойств
Контрольная сумма файла
Копирование, переименование, удаление файлов
Архивы ZIP
Создание архива ZIP
Распаковка архива ZIP
Обход дерева каталогов

Назад Вперед

7.21. Просмотр каталога с фильтром

В примере показан способ организации просмотра содержимого каталогов с помощью методов класса File. По сравнению с предыдущим примером мы добавили возможность просмотра с использованием фильтра - маски имени файла. Указав маску специального вида, можно просмотреть список каталогов, расположенных в заданном каталоге (без включения в него имен имеющихся там файлов).

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

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

public String[] list();
public String[] list(
  FilenameFilter filter);

Сейчас нас интересует вторая реализация этого метода, которая позволяет получить список только тех объектов, что удовлетворяют условиям, определенным в фильтре filter класса FilenameFilter.

Для использования фильтра вы должны создать класс, реализующий интерфейс FilenameFilter. В рамках этого интерфейса необходимо определить метод accept:

class MaskFilter
  implements FilenameFilter
{
  MaskFilter(String sMask)
  {
    . . .
  }
  
  public boolean accept(File f, String name)
  {
    . . .
  }
}

Этот метод будет вызываться для каждого объекта. Ему передается ссылка на объект класса File, соответствующая каталогу, для которого выполняется просмотр, и строка имени файла.

Метод может проанализировать переданную ему информацию и вернуть одно из двух значений - true или false. Если метод вернет значение true, объект попадет в список, если false - нет.

Описание примера

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

Если маска задается как "*" или если не задается совсем, в список включаются все файлы:

Enter full path ('quit' to exit): 
d:\

Enter mask: *
-dir- Backup
-dir- cdtest
-dir- Library
-dir- Logos
-dir- Multimedia Files
-dir- NTRESKIT
pagefile.sys
-dir- Program Files
-dir- RECYCLER
SQL.LOG
-dir- TEMP
WD1
-dir- WINNT
-dir- zakadmin
-dir- ZAKAppDist
Enter full path ('quit' to exit):

В том случае когда маска задана как "*dir", список будет состоять только из имен каталогов:

Enter full path ('quit' to exit): 
d:\

Enter mask: *dir
-dir- Backup
-dir- cdtest
-dir- Library
-dir- Logos
-dir- Multimedia Files
-dir- NTRESKIT
-dir- Program Files
-dir- RECYCLER
-dir- TEMP
-dir- WINNT
-dir- zakadmin
-dir- ZAKAppDist
Enter full path ('quit' to exit):

И, наконец, если указать любую другую строку в качестве шаблона, в списке появятся только такие файлы и каталоги, имена которых заканчиваются строкой шаблона. Например:

Enter full path ('quit' to exit): 
c:\

Enter mask: SYS
MSDOS.SYS
CONFIG.SYS
IO.SYS
Enter full path ('quit' to exit):

Рассмотрим исходный текст приложения.

Отображение списка содержимого каталогов выполняется в цикле. Сразу после запуска цикла наша программа запрашивает у пользователя путь к каталогу и строку шаблона:

String s;
String sMask;
int i;
    
while(true)
{    
  System.out.println(
    "Enter full path ('quit' to exit): ");
        
  s = new String(getKbdString());

  if(s.equals("quit"))
    break;

  System.out.print("\nEnter mask: ");
  sMask = new String(getKbdString());
  . . .
}

Путь к каталогу сохраняется в переменной s, а строка шаблона - в переменной sMask. Если пользователь ввел в качестве пути строку "quit", программа завершает свою работу.

Далее мы создаем объект f класса File для пути, введенного пользователем, и проверяем, существует ли соответствующий объект:

File f = new File(s);
if(!f.exists())
{
  System.out.println("\nNot found: " + s);
  continue;
}

Кроме того, мы проверяем, что указанный объект действительно является каталогом, а не файлом:

if(!f.isDirectory())
{
  System.out.println(
    "\nNot directory: " + s);
  continue;
}

В том случае когда пользователь указал существующий каталог, наша программа заполняет массив строк sDirList списком имеющихся там объектов:

String[] sDirList = 
  f.list(new MaskFilter(sMask));

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

Заполненный массив отображается на консоли в виде строк аналогично тому, как это сделано в предыдущем приложении:

for(i = 0; i < sDirList.length; i++)
{
  File f1 = new File(
    s + File.separator + sDirList[i]);
        
  if(f1.isFile())
    System.out.println(sDirList[i]);
  else  
    System.out.println(
      "-dir- " + sDirList[i]);
}

Теперь о том, как устроен класс MaskFilter. Его исходный текст приведен ниже полностью:

class MaskFilter
  implements FilenameFilter
{
  String mask;
  
  MaskFilter(String sMask)
  {
    mask = sMask;
  }
  
  public boolean accept(File f, String name)
  {
    if(mask.equals("*"))
      return true;
      
    else if(mask.equals("*dir"))
      return(new File(f, name).isDirectory());
      
    else
      return(name.endsWith(mask));  
  }
}

Класс MaskFilter имеет конструктор и реализует интерфейс FilenameFilter, в рамках которого определен единственный метод accept.

Конструктор получает в качестве параметра строку шаблона и сохраняет ее в поле mask.

Метод accept анализирует шаблон mask и имя файла name.

Если шаблон указан как "*", метод accept возвращает значение true. В результате в список файлов попадут имена любых файлов и каталогов.

В том случае когда шаблон имеет вид "*dir", метод accept возвращает значение true только в том случае, если анализируемый объект является каталогом. Для проверки этого факта метод accept создает объект класса File и вызывает для него метод isDirectory.

Прочие шаблоны обрабатываются при помощи метода endsWith. Если имя файла оканчивается символами, заданными в шаблоне, метод accept возвращает значение true. Это же значение возвращается и при пустой строке шаблона.


Назад Вперед

[Назад]