Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 2© Александр Фролов, Григорий ФроловТом 32, М.: Диалог-МИФИ, 1997, 288 стр. Приложение DirListВ приложении DirList мы используем класс File для получения списка всех файлов и каталогов, расположенных в заданном каталоге. После запуска приложение DirList предлагает ввести путь к каталогу и маску для имени файла (рис. 2.9).
Рис. 2.9. Работа приложения DirList Если вместо маски задать символ ‘*’, как мы сделали это на рис. 2.9, приложение выведет полный список файлов и каталогов, выделив каталоги прописными буквами. В том случае, если будет задна другая маска, в окне появятся только такие файлы, которые содержат эту маску как подстроку (рис. 2.10).
Рис. 2.10. Просмотр содержимого каталога c:\dos с маской com Исходный текст приложенияИсходный текст приложения DirList представлен в листинге 2.8. Листинг 2.8. Файл DirList\DirList.java
// =========================================================
// Просмотр содержимого каталога при помощи класса File
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW: http://www.glasnet.ru/~frolov
// или
// http://www.dials.ccas.ru/frolov
// =========================================================
import java.io.*;
import java.util.*;
// =========================================================
// Класс DirList
// Главный класс приложения
// =========================================================
public class DirList
{
// -------------------------------------------------------
// main
// Метод, получающий управление при запуске приложения
// -------------------------------------------------------
public static void main(String args[])
{
// Массив для ввода строки с клавиатуры
byte bKbdInput[] = new byte[256];
// Путь к каталогу, содержимое которого
// мы будем просматривать
String sDirPath;
// Маска для просмотра
String sMask;
// Массив строк содержимого каталога
String[] dirlist;
try
{
// Выводим строку приглашения для ввода пути
// к каталогу, содержимое которого будем просматривать
System.out.println("Enter directory path...");
System.in.read(bKbdInput);
sDirPath = new String(bKbdInput, 0);
StringTokenizer st;
st = new StringTokenizer(sDirPath, "\r\n");
sDirPath = new String((String)st.nextElement());
// Вводим строку маски
System.out.println("Enter mask...");
System.in.read(bKbdInput);
sMask = new String(bKbdInput, 0);
st = new StringTokenizer(sMask, "\r\n");
sMask = new String((String)st.nextElement());
// Создаем объект класса File, соответствующий
// введенному пути
File fdir = new File(sDirPath);
// Если указанный каталог не существует,
// выводим сообщение и завершаем работу
if(!fdir.exists())
{
System.out.println("Directory not found: "
+ sDirPath);
}
// Если путь существует, определяем параметры
// соответствующего файла или каталога
else
{
// Проверяем, был указан файл или каталог
if(!fdir.isDirectory())
System.out.println("File " + sDirPath +
" is not directory");
// Если указан каталог, получаем его содержимое
else
{
// Если маска не задана, вызываем метод list
// без параметров
if(sMask == null)
dirlist = fdir.list();
// Вызываем метод list, создавая фильтр
else
dirlist = fdir.list(new MaskFilter(sMask));
// Сканируем полученный массив
for (int i = 0; i < dirlist.length; i++)
{
// Для каждого объекта, обнаруженного в
// каталоге, создаем объект класса File
File f = new File(sDirPath + "\\" + dirlist[i]);
// Имена файлов отображаем строчными буквами
if(f.isFile())
System.out.println(dirlist[i].toLowerCase());
// Имена каталогов оставляем без изменения
else
System.out.println(dirlist[i]);
}
}
}
System.out.println("Press <Enter> to terminate...");
System.in.read(bKbdInput);
}
catch(Exception ioe)
{
System.out.println(ioe.toString());
}
}
}
// =========================================================
// Класс MaskFilter
// Фильтр для просмотра каталога
// =========================================================
class MaskFilter implements FilenameFilter
{
// Поле для хранения маски имени
String sNameMask;
// -------------------------------------------------------
// Конструктор класса MaskFilter
// Сохраняет маску фильтра
// -------------------------------------------------------
MaskFilter(String sMask)
{
// Записываем маску прописными буквами
sNameMask = sMask.toUpperCase();
}
// -------------------------------------------------------
// Метод accept
// Проверка имени по маске
// -------------------------------------------------------
public boolean accept(File dir, String name)
{
// Если маска указана как символ *, подходит любое имя
if(sNameMask.equals("*"))
return true;
// Если имя содержит маску, возвращаем значение true
return (name.indexOf(sNameMask) != -1);
}
}
Описание исходного текстаВ начале своей работы приложение вводит с клавиатуры путь к каталогу и отрезает из полученной строки символ новой строки, пользуясь для этого классом StringTokenizer:
System.out.println("Enter directory path...");
System.in.read(bKbdInput);
sDirPath = new String(bKbdInput, 0);
StringTokenizer st;
st = new StringTokenizer(sDirPath, "\r\n");
sDirPath = new String((String)st.nextElement());
Строка пути записывается в поле sDirPath. Аналогичным образом вводится и обрабатывается маска, которая записывается в поле sMask. Далее создается объект класса File, соответствующий каталогу sDirPath, содержимое которого нужно просмотреть: File fdir = new File(sDirPath); После этого выполняется проверка существования пути, а также проверка, указывает ли этот путь на каталог. Для проверки мы применяем методы exists и isDirectory, рассмотренные ранее. Если все нормально, и был указан существующий каталог, приложение анализирует поле маски sMask. В случае пустой маски для получения содержимого каталога мы вызваем метод list без параметров: if(sMask == null) dirlist = fdir.list(); Если же маска определена, вызывается второй вариант этого же метода: else dirlist = fdir.list(new MaskFilter(sMask)); Здесь в качестве параметра методу list мы передаем вновь созданный объект класса MaskFilter (фильтр), передав соответствующему конструктору строку маски. В любом случае метод list заполняет полученным списком массив строк dirlist. Содержимое этого массива перебирается в цикле:
for (int i = 0; i < dirlist.length; i++)
{
File f = new File(sDirPath + "\\" + dirlist[i]);
if(f.isFile())
System.out.println(dirlist[i].toLowerCase());
else
System.out.println(dirlist[i]);
}
Для каждого элемента массива мы создаем объект класса File, передавая конструктору путь каталога, добавив к нему разделитель и строку элемента массива. Затем если данная строка соответсвует файлу, а не каталогу, имя выводится строчными буквами. Для преобразования мы вызываем метод toLowerCase, определенный в классе String. Рассмотрим теперь класс MaskFilter, предназначенный для фильтрации имен, которые метод list возвращает вызвавшему его методу. Класс MaskFilter определен следующим образом:
class MaskFilter implements FilenameFilter
{
. . .
}
Как видно из определения, этот класс реализует интерфейс FilenameFilter. В рамках интерфейса FilenameFilter вам нужно переопределить метод accept, который проверяет, подходит ли имя файла критерию отбора, заданному маской, и в зависимости от этого возвращает либо значение true (если подходит), либо false (если не подходит). Маска передается конструктору класса MaskFilter, преобразуется им в прописные буквы и сохраняется в поле sNameMask для использования в процессе проверки методом accept:
MaskFilter(String sMask)
{
sNameMask = sMask.toUpperCase();
}
Что же касается метода accept, то он выглядит достаточно просто:
public boolean accept(File dir, String name)
{
if(sNameMask.equals("*"))
return true;
return (name.indexOf(sNameMask) != -1);
}
В качестве первого параметра этому методу передается путь к каталогу, а в качестве второго - имя файла. Метод accept вызывается для каждого файла и каталога, расположенного в каталоге dir. Наша реализация этого метода вначале проверяет маску. Если маска задана как строка “*”, подходит любое имя, поэтому метод accept всегда возвращает значение true. Если же используются другие маски, то наш метод выполняет ее поиск в строке имени с помощью метода indexOf. Если строка маски найдена как подстрока имени файла или каталога, такое имя нам подходит и метод accept возвращает значение true. В противном случае возвращается значение false. |



