Назад
Вперед
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. Это же значение
возвращается и при пустой строке шаблона.
Назад Вперед |