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. |