Rambler's Top100IT • archiv

rus / eng | Логин | Комментарий к колонке | Печать | Почта | Клуб




Колонки


Разработка мобильного словаря с использованием JDBC. Часть 2

 
(Николай Зайкин)

2. Анализ файлов словарей.

Для начала создадим пакет, в котором будут размещаться все наши классы.

Перейдите в проект Mobile Dictionary (или создайте его, если он еще не был создан), и создайте пакет mdict.jdbc.

Создание пакета mdict.jdbc

Нажмите кнопку мастера (SmartGuide) создания класса Кнопка мастера создания класса и выполните следующие шаги:

Введите имя файла FilesTester, остальные настройки оставтьте по умолчанию (на всякий случай, сверьтесь со скриншотом):

Создание класса для тестирования текстовых файлов

Нажмите кнопку Next >.

Во втором шаге выполните следующие действия:

  1. Так как класс использует обращение к файловой системе, импортируйте пакет java.io.*, с помощью кнопки AddPackage.
  2. Отключите флажки (checkboxes) Methods which must be implemented и Copy constructor from superclass - нам они не требуются.
  3. Включите флажок (checkbox) main (String[]) - нам требуется этот метод, так как мы пишем запускаемый класс, а он отличается от обычного класса наличием этого метода с зарезервированным именем.
Создание класса для тестирования текстовых файлов

Нажмите кнопку Finish.

После работы мастера, у вас должно получиться что-то типа этого на экране (пустой класс FilesTester с пустым методом main):

Созданный пустой класс для тестирования текстовых файлов

Обратите внимание на символ бегущего человечка справа сверху от имени класса (Символ бегущего человечка означает запускаемый класс) . Таким способом VisualAge for Java помечает классы, которые можно запускать.

Перейдите в метод main(String[]) и скопируйте туда следующий текст:

   String dirName = ".";
    if (args.length > 0) {
        dirName = args[0];
    }

    new FilesTester(dirName);

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

После этого создается экземпляр класса FilesTester и передается управление в конструктор.

Для начала создадим конструктор класса. Нажмите на кнопку создания метода Кнопка создания нового метода, в появившемся окне

  • Выберите Create a new constructor.
  • В текстовое поле введите public FilesTester(String dirName)
Создание конструктора класса

Нажмите кнопку Finish

Для считывания имен файлов (словарей) в каталоге мы используем класс java.io.File (пакет java.io.* мы импортировали на этапе создания класса мастером, поэтому сейчас мы можем обращаться к классу просто как File) и его метод list().

Чтобы этот метод выбирал ("фильтровал") только файлы, имеющие расширение "dict", мы будем использовать класс-фильтр для метода list().

Классом-фильтром может быть любой класс, реализующий интерфейс java.io.FilenameFilter. Суть этого интерфейса в том, что он обязует класс иметь один метод public boolean accept(File dir, String name), который должен сообщать методу list(), следует ли включать файл с именем name из каталога dir в результирующий массив строк имен файлов.

Итак, сделаем так, чтобы класс FilesTester реализовывал интерфейс java.io.FilenameFilter:

  • Нажмите на имя класса, и поле редактора измените :
    public class FilesTester {
    }
    
    
    на
    public class FilesTester implements FilenameFilter {
    }
    
    
  • Далее, надо добавить метод public boolean accept(File dir, String name) в наш класс. Эта процедура вам уже известна по созданию конструктора класса. После создания заголовка функции, введите в ее тело следующий код:
       if (name.endsWith("dict") && (new File(dir, name)).isFile()) {
            return true;
        }
    
        return false;
    
    
    Логика функции очевидна. Если имя файла оканчивается на "dict" и он является обычным файлом, а не каталогом, то возвращается значение true.

Рассмотрим в завершение сам конструктор.

Сначала создаем экземпляр типа File и производим чтение имен файлов словарей в массив строк. При возникновении каких-либо сбоев, завершаем работу:

   File d = new File(dirName);

    String s[] = d.list(this);

    if (s == null) {
        System.out.println("Incorrect directory name '" + dirName + "'.");
        System.exit(0);
    }

    if (s.length == 0) {
        System.out.println("Directory '" + dirName + "' is empty.");
        System.exit(0);
    }

Далее идет описание некоторых вспомогательных переменных, которые надо вынести за пределы цикла для экономии ресурсов. Хорошим стилем программирования считается инициализация переменных при их объявлении.

   FileReader fileInStream;
    BufferedReader dataInStream;
    String result = "";
    boolean isWord = true;
    boolean firstLine = true;
    int maxLength = 0;
    String current = "";

Далее перебираем все файлы словарей и выбираем максимальный размер перевода слова.

   for (int i = 0; i < s.length; i++) {
        try {
            fileInStream = new FileReader(dirName + File.separator + s[i]);
            dataInStream = new BufferedReader(fileInStream);

            while ((result = dataInStream.readLine()) != null) {

                isWord = (result.trim().length() == 0);

                if (isWord) {
                    if (current.length() > maxLength) {
                        maxLength = current.length();
                    }
                    current = "";
                    // first line will be a word
                    firstLine = true;
                } else {
                    // check for word (first line)
                    // we don't need to count word length,
                    // only translation length
                    if (firstLine) {
                        firstLine = false;
                    } else {
                        // add rarriage return characters,
                        // because readLine() method trim them
                        current += result + "\r\n";
                    }

                }

            }
            fileInStream.close();
            dataInStream.close();
            System.out.println("Processed file : " + s[i] +
                 "\t Current maximum field length is : " + maxLength);
        } catch (Throwable exc) {
            exc.printStackTrace(System.out);
        }
    }


В завершение работы программы выводим макимальное значение на экран.

System.out.println("------------------------------------------------------"); System.out.println("Overall maximum field length is : " + maxLength);

Нажав последний раз на Ctrl+S и убедившись, что ошибок нет, вы можете запускать программу на выполнение. Это можно сделать двумя способами. Либо из IDE VisualAge for Java, либо из командной строки после экспорта откомпилированного класса.

Рассмотрим оба случая.

Для запуска класса из IDE нам надо нажать на кнопку в левом верхнем углу: Кнопка запуска класса на исполнение.

Но после запуска мы получаем сообщение

Directory '.' is empty.

Это вполне логично, так как по умолчанию у нас задан текущий каталог проекта ( в нашем случае "d:\program files\ibm\visualage for java\ide\project_resources\Mobile Dictionary\"), и программа не может найти словари.

Для задания своего каталога нам надо передать его в коммандной строке. Это делается следующим образом: Выберите меню Selected -> Run -> Run main with ... Если вы например, предварительно поместили словари в каталог

c:\dicts

то задайте в текстовом поле "c:\\dicts":

Задание параметров коммандной строки
.

После запуска у вас должно получиться что-то типа этого

Результат работы программы
.

Второй способ запуска программы - из командной строки.

Для этого надо экспортировать откомпилированный класс. Нажмите меню File -> Export и выберите формат в виде jar файла, далее введите путь и имя jar файла:

Экспорт класса

Получив файл mdict.jdbc.jar в каталоге c:\dicts вы сможете запустить на выполнение следующей строкой:

c:\dicts>java -cp mdict.jdbc.jar mdict.jdbc.FilesTester

Запуск на выполнение из комманой строки

Теперь мы узнали, что максимальный размер поля будет равен 2618 байт, следовательно для хранения столбца translation нам понадобится тип TEXT, который позволяет хранить текстовые данные размером до 65536, а не CHAR(N) (до 256 символов).

Приступим к созданию таблиц.

TOC | Часть 3 >




Справка | Условия Copyright © 1999 — 2008, IT • archiv.
В начало | Логин | Комментарий к колонке | Поиск | Почта