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

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.

[Назад] [Содеожание] [Дальше]