Книги в продаже (аннотация + содержание + отрывок)

Я. Дарвин
JAVA. СБОРНИК РЕЦЕПТОВ ДЛЯ ПРОФЕССИОНАЛОВ.
Цена: 336 р.

Источник: Издательский дом 'ПИТЕР'
Разделы: Java, J++
Подробнее: Информация от издателя (открывается в новом окне)
Заказ: Оформление покупки (открывается в новом окне)
      Эта книга идеальна для любого, кто знает Java в какой-то степени и хочет знать больше. В первую очередь в ней говорится об интерфейсах прикладного программирования (API) Java и показывается на примерах, что такое API и для чего они нужны. Исходной моделью этой книги является хорошо знакомая поваренная книга. Каждый ее раздел подобен кулинарному рецепту: ставится задача, дается ее решение, которое далее подробно рассматривается. Код в любом разделе самодостаточен, и читатель может свободно заимствовать любые его фрагменты в своих собственных проектах. Наряду с т
      онкостями использования Java в книге рассматривается широкий круг типовых задач, встречающихся в практической деятельности программистов.
     
     
     
      Содержание
      Предисловие
      Для кого эта книга
      Что в этой книге?
      Замечания относительно платформ
      Соглашения, использованные в этой книге
      Получение исходного кода
     
      От издательства
      Глава 1. Начало: компиляция, выполнение, отладка
      1.0. Вступление
      1.1. Компиляция и выполнение программ на языке Java: JDK
      1.2. Редактирование и компиляция в редакторах с цветовым выделением синтаксиса
      1.3. Компиляция, выполнение и тестирование в интегрированной среде разработки
      1.4. Использование классов из примеров этой книги
      1.5. Автоматическая компиляция при помощи сценария jr
      1.6. Автоматизация компиляции при помощи make-файла
      1.7. Автоматизация компиляции при помощи программы Ant
      1.8. Выполнение апплетов
      1.9. Действия при выдаче предупреждений
      1.10. Условная отладка без #ifdef
      1.11. Вывод отладочной информации
      1.12. Работа с отладчиком
      1.13. Модульное тестирование
      1.14. Декомпиляция класс-файлов Java
      1.15. Предотвращение декомпиляции Java-файлов
      1.16. Получение годных для чтения трассировок
      1.17. Поиск исходных текстов на языке Java
      1.18. Программа Debug
      Глава 2. Взаимодействие со средой
      2.0. Вступление
      2.1. Получение переменных окружения
      2.2. Свойства системы
      2.3. Разработка кода, зависящего от версий JDK
      2.4. Создание кода, зависящего от операционной системы
      2.5. Эффективное использование переменной окружения CLASSPATH
      2.6. Использование расширений или других API
      2.7. Анализ параметров командной строки
      Глава 3. Строки
      3.0. Вступление
      3.1. Разбивка строк на подстроки
      3.2. Разбор строк при помощи StringTokenizer
      3.3. Конкатенация строк
      3.4. Посимвольная обработка строки
      3.5. Выравнивание строк
      3.6. Преобразование между строками и символами Unicode
      3.7. Инверсия строк по словам или символам
      3.8. Расширение и сжатие табуляций
      3.9. Преобразования регистра символов
      3.10. Отступы и выступы в текстовых документах
      3.11. Ввод непечатаемых символов
      3.12. Удаление пробелов в конце строки
      3.13. Лексический разбор данных, разделенных запятыми
      3.14. Программа: обычный текстовый форматтер
      3.15. Приблизительный поиск имен
      Глава 4. Поиск с применением регулярных выражений
      4.0. Вступление
      4.1. Синтаксис регулярного выражения
      4.2. Как работают регулярные выражения
      4.3. Регулярные выражения в Java
      4.4. Интерактивное тестирование регулярных выражений
      4.5. Получение совпавшего текста
      4.6. Замена по шаблону
      4.7. Печать всех экземпляров шаблона
      4.8. Вывод строк, содержащих совпадения
      4.9. Управление регистром символов при вызовах match() и subst()
      4.10. Предварительная компиляция регулярных выражений
      4.11. Поиск символов конца строки
      4.12. Программа извлечения данных
      4.13. Полная версия программы Grep
      Глава 5. Числа
      5.0. Вступление
      5.1. Проверка строковых представлений чисел
      5.2. Хранение больших чисел в переменной меньшего типа
      5.3. Умножение целого на дробь без вычислений с плавающей точкой
      5.4. Точность чисел с плавающей точкой
      5.5. Сравнение чисел с плавающей точкой
      5.6. Округление чисел с плавающей точкой
      5.7. Форматирование чисел
      5.8. Преобразования двоичных, восьмеричных, десятичных и шестнадцатеричных чисел
      5.9. Последовательности целых чисел
      5.10. Римские цифры
      5.11. Форматирование в соответствии с множественным числом имен существительных
      5.12. Генерирование случайных чисел
      5.13. Генерирование случайных чисел (лучший способ)
      5.14. Вычисление тригонометрических функций
      5.15. Вычисление логарифмов
      5.16. Умножение матриц
      5.17. Комплексные числа
      5.18. Очень большие числа
      5.19. Программа TempConverter
      5.20. Программа создания чисел-палиндромов
      Глава 6. Даты и время
      6.0. Вступление
      6.1. Поиск текущей даты
      6.2. Вывод даты и времени в определенном формате
      6.3. Представление дат в других календарях
      6.4. Преобразование YMDHMS в Calendar или Date
      6.5. Разбор строк на даты
      6.6. Преобразование секунд эпохи в DMYHMS
      6.7. Сложение или вычитание из даты или календаря
      6.8. Разность между двумя датами
      6.9. Сравнение дат
      6.10. Порядковый номер дня недели, месяца, года или недели
      6.11. Страница календаря
      6.12. Таймеры высокого разрешения
      6.13. Пауза
      6.14. Программа ReminderService
      Глава 7. Структуры данных в Java
      7.0. Вступление
      7.1. Хранение данных в массивах
      7.2. Изменение размеров массива
      7.3. Динамический массив
      7.4. Универсальный механизм доступа к данным с использованием итераторов
      7.5. Хранение данных в связанном списке
      7.6. Хранение ассоциативных данных в классах Hashtable и HashMap
      7.7. Сохранение строк в классах Properties и Preferences
      7.8. Сортировка коллекции
      7.9. Сортировка в Java 1.1
      7.10. Автоматическая сортировка
      7.11. Множества
      7.12. Поиск объекта в коллекции
      7.13. Преобразование коллекции в массив
      7.14. Самостоятельная реализация итераторов
      7.15. Стек
      7.16. Многомерные структуры данных
      7.17. Коллекции
      7.18. Пример: хронометраж
      Глава 8. Объектно-ориентированное программирование
      8.0. Вступление
      8.1. Печать объектов: форматирование с помощью метода toString()
      8.2. Переопределение метода Equals
      8.3. Переопределение метода Hashcode
      8.4. Метод Clone
      8.5. Метод Finalize
      8.6. Вложенные классы
      8.7. Обратные вызовы через интерфейсы
      8.8. Полиморфизм и абстрактные методы
      8.9. Передача значений
      8.10. Создание собственных исключений
      8.11. Программа Plotter
      Глава 9. Ввод/вывод
      9.0. Вступление
      9.1. Чтение стандартного ввода
      9.2. Программирование стандартного вывода
      9.3. Открытие файла по имени
      9.4. Копирование файла
      9.5. Чтение файла в строку
      9.6. Переназначение стандартных потоков
      9.7. Дублирование потока при записи
      9.8. Чтение и запись в разных кодировках
      9.9. Символы новой строки
      9.10. Зависящий от платформы код файла
      9.11. Чтение продолженных строк
      9.12. Сканирование файла
      9.13. Двоичные данные
      9.14. Поиск
      9.15. Запись потоков данных из языка C
      9.16. Сохранение и восстановление сериализованных объектов
      9.17. Борьба с исключениями ClassCastExceptions с помощью SerialVersionUID
      9.18. Чтение и запись архивов JAR или ZIP
      9.19. Чтение и запись сжатых файлов
      9.20. Программа: вывод текста на устройствах PostScript
      9.21. Программа: TarList (конвертер файлов)
      Глава 10. Операции с каталогами и файловой системой
      10.0. Вступление
      10.1. Получение информации о файле
      10.2. Создание файла
      10.3. Переименование файла
      10.4. Удаление файла
      10.5. Создание временного файла
      10.6. Изменение атрибутов файла
      10.7. Создание списка содержимого каталога
      10.8. Получение списка корневых каталогов
      10.9. Создание новых каталогов
      10.10. Программа Find
      Глава 11. Программирование последовательных и параллельных портов
      11.0. Вступление
      11.1. Выбор порта
      11.2. Открытие последовательного порта
      11.3. Открытие параллельного порта
      11.4. Разрешение конфликтов портов
      11.5. Чтение и запись: Lock Step
      11.6. Чтение и запись: управление на основе событий
      11.7. Чтение и запись: нити
      11.8. Программа: Penman Plotter
      Глава 12. Графика и звук
      12.0. Вступление
      12.1. Рисование с помощью объекта Graphics
      12.2. Тестирование графических компонентов
      12.3. Вывод текста
      12.4. Вывод центрированного текста в компоненте
      12.5. Вывод текста с эффектом тени
      12.6. Вывод рисунка
      12.7. Проигрывание звукового файла
      12.8. Вывод видео
      12.9. Вывод текста с помощью объекта Graphics2D
      12.10. Печать в JDK 1.1
      12.11. Печать в Java 2
      12.12. Программа PlotterAWT
      12.13. Программа Grapher
      Глава 13. Графический интерфейс пользователя
      13.0. Вступление
      13.1. Вывод компонентов графического интерфейса пользователя
      13.2. Проектирование разметки окна
      13.3. Использование вкладок
      13.4. Обработка событий: заставляем кнопки работать
      13.5. Обработка событий с использованием анонимных внутренних классов
      13.6. Прерывание программы при закрытии окна
      13.7. Диалоговые окна
      13.8. Показ вывода программы в окне
      13.9. Выбор файла с помощью класса JFileChooser
      13.10. Выбор цвета
      13.11. Центрирование главного окна
      13.12. Изменение вида и поведения программы с использованием пакета Swing
      13.13. Программа выбора цветов
      13.14. Программа: собственный менеджер разметки
      Глава 14. Интернационализация и локализация
      14.0. Вступление
      14.1. Создание кнопок с помощью ресурсов интернационализации
      14.2. Вывод списка доступных локальных контекстов
      14.3. Создание меню с помощью ресурсов интернационализации
      14.4. Создание процедур интернационализации
      14.5. Создание диалоговых окон с помощью ресурсов интернационализации
      14.6. Создание пакета ресурсов
      14.7. Обработка кода с помощью JILT
      14.8. Использование конкретного локального контекста настроек
      14.9. Установка локального контекста по умолчанию
      14.10. Форматирование сообщений
      14.11. Программа MenuIntl
      14.12. Программа BusCard
      Глава 15. Сетевые клиенты
      15.0. Вступление
      15.1. Связь с сервером
      15.2. Поиск сетевых адресов
      15.3. Обработка сетевых ошибок
      15.4. Чтение и запись текстовых данных
      15.5. Чтение и запись двоичных данных
      15.6. Чтение и запись данных, преобразованных в последовательную форму
      15.7. Дейтаграммы UDP
      15.8. Программа: клиент TFTP UDP
      15.9. Программа: клиент Telnet 15.10. Программа: клиент для интерактивного обмена сообщениями
      Глава 16. Java на стороне сервера: сокеты
      16.0. Вступление
      16.1. Открытие сервера для бизнеса
      16.2. Возвращение отклика (строкового или двоичного)
      16.3. Возвращение информации об объекте
      16.4. Поддержка многих клиентов
      16.5. Регистрация событий по сети 16.6. Программа: сервер для интерактивного обмена сообщениями
      Глава 17. Сетевые клиенты II: апплеты и web-клиенты
      17.0. Вступление
      17.1. Внедрение технологии Java в web-страницы
      17.2. Программирование апплетов
      17.3. Связывание сервера с хостом апплета
      17.4. Как заставить апплет показывать документ
      17.5. Как заставить апплет запускать сценарий CGI
      17.6. Чтение содержимого URL
      17.7. Извлечение кода HTML из URL
      17.8. Извлечение URL из файла
      17.9. Преобразование имени файла в URL
      17.10. Программа MkIndex
      17.11. Программа LinkChecker
      Глава 18. Java на web-сервере: сервлеты и JSP
      18.0. Вступление
      18.1. Первый сервлет: построение страницы HTML
      18.2. Сервлеты: обработка параметров формы
      18.3. Элементы Cookie
      18.4. Отслеживание сеансов
      18.5. Генерирование документа в формате PDF из сервлета
      18.6. Интеграция HTML с Java: JSP
      18.7. Директивы JSP Include и Forward
      18.8. Использование сервлетов в JSP
      18.9. Упрощение вашего кода JSP с помощью компонента JavaBean
      18.10. Сводка синтаксиса JSP
      18.11. Программа CookieCutter
      18.12. Программа: web-портал новостей JabaDot
      Глава 19. Язык Java и электронная почта
      19.0. Вступление
      19.1. Отправка электронной почты: версия для браузера
      19.2. Отправка электронной почты: для реального использования
      19.3. Работа с почтой в серверной программе
      19.4. Посылка почты в кодировке MIME
      19.5. Установка почтовых настроек
      19.6. Отправка почты без использования JavaMail
      19.7. Чтение электронной почты
      19.8. Программа MailReaderBean
      19.9. Программа MailClient
      Глава 20. Доступ к базам данных
      20.0. Вступление
      20.1. Текстовые файлы в роли баз данных
      20.2. Базы данных DBM
      20.3. Установка JDBC и соединение
      20.4. Подключение к базе данных JDBC
      20.5. Отправка запроса JDBC и получение результатов
      20.6. Использование параметризованных выражений JDBC
      20.7. Использование хранимых процедур с JDBC
      20.8. Изменение данных с помощью объекта ResultSet
      20.9. Изменение данных с помощью SQL
      20.10. Поиск метаданных JDBC
      20.11. Программа JDAdmin
      Глава 21. XML
      21.0. Вступление
      21.1. Преобразование документа XML с помощью XSLT
      21.2. Синтаксический разбор документа XML с помощью SAX
      21.3. Синтаксический разбор документа XML с помощью DOM
      21.4. Проверка структуры с помощью DTD
      21.5. Построение документов XML с помощью DOM
      21.6. Программа xml2mif
      Глава 22. Распределенные приложения Java: RMI
      22.0. Вступление
      22.1. Определение контракта RMI
      22.2. Клиент RMI
      22.3. Сервер RMI
      22.4. Использование RMI по сети
      22.5. Программа: обратные вызовы RMI
      22.6. Программа RMIWatch
      Глава 23. Пакеты и упаковка
      23.0. Вступление
      23.1. Создание пакета
      23.2. Документирование классов с помощью Javadoc
      23.3. Архивирование с помощью программы JAR
      23.4. Запуск апплета из архива JAR
      23.5. Запуск апплета с использованием JDK
      23.6. Запуск программы из архива JAR
      23.7. Подготовка класса как компонента JavaBean
      23.8. Упаковка компонента в архив JAR
      23.9. Упаковка сервлета в файл WAR
      23.10. "Написанное однажды устанавливается везде"
      23.11. Java WebStart
      23.12. Добавление подписи к файлу JAR
      Глава 24. Нити в языке Java
      24.0. Вступление
      24.1. Выполнение кода в другой нити
      24.2. Вывод движущегося изображения с анимацией
      24.3. Остановка работы нити
      24.4. Встречи и тайм-ауты
      24.5. Взаимодействие нитей: синхронизированный код
      24.6. Взаимодействие нитей: методы wait() и notifyAll()
      24.7. Фоновое сохранение в редакторе
      24.8. Сетевой сервер с использованием нитей
      Глава 25. Самоанализ или "класс под названием Class"
      25.0. Вступление
      25.1. Получение дескриптора файла
      25.2. Поиск и использование методов и полей
      25.3. Динамическая загрузка и создание экземпляра класса
      25.4. Создание класса с нуля
      25.5. Хронометраж
      25.6. Вывод информации о классе
      25.7. Программа CrossRef
      25.8. Программа AppletViewer
      Глава 26. Использование языка Java с другими языками
      26.0. Вступление
      26.1. Запуск программы
      26.2. Запуск программы и перехват ее вывода
      26.3. Объединение кода Java и сценариев с помощью BSF
      26.4. Вызов родного кода C/C++
      26.5. Вызов кода Java из кода C/C++
      26.6. Программа DBM
      Послесловие
      Алфавитный указатель
     
     
     
      ОТРЫВОК
     
      Взаимодействие со средой
      2.0. Вступление
      В этой главе рассматривается, как Java-программа взаимодействует с непосредственным окружением, с тем, что называется среда выполнения исполнительной средой (runtime environmentRuntime environment). Что бы вы ни делали в Java-программе, используя практически любой прикладной интерфейс (API, Application Programming InterfaceAPI), все так или иначе связано со средой. Здесь речь пойдет только о том, c чем непосредственно взаимодействует программа. Также мы познакомимся с классом System, содержащим разнообразную информацию об операционной системе.
      Заслуживают упоминания и два других класса. Первый, java.lang.Runtime, заложен в основу многих методов класса System - например, метод System.exit() вызывает метод Runtime.exit(). С технической точки зрения этот класс тоже относится к "среде", но напрямую он используется лишь в случае запуска других программ (см. раздел 26.1). Объект java.awt.Toolkit также является частью среды и описан в главе 12.
      2.1. Получение переменных окружения
      Задача
      Получить переменные окружения из Java-программы.
      Решение
      Не делайте этого.
      Комментарий
      В седьмой версии Unix 1979 года впервые появилась новая особенность операционной системы, известная как переменные окружения (environment variables). Переменные окружения имеются во всех современных системах Unix и в более поздних системах с интерфейсом командной строки (таких, как DOS, лежащая в основе MS-Windows), но отсутствуют в компьютерах Macintosh, Palm Pilot, SmartCard и других Java-средах. Переменные окружения повсеместно используются для настройки окружения выполняемой программы на компьютере, откуда и возникло такое название. Возьмем для примера случай, знакомый большинству читателей. В системах Unix или DOS переменная окружения PATH определяет область поиска системой выполняемых программ. Естественно, возникает вопрос - как получить переменные окружения из Java-программы?
      Теоретически в некоторых версиях Java это возможно, но делать это не стоит. Исполнительная среда Java разрабатывалась с расчетом на переносимость программ, поэтому любое использование средств операционной системы, не поддерживаемых во всех Java-платформах, считается нежелательным. Выше упоминались некоторые Java-платформы, не имеющие переменных окружения.
      Впрочем, если вы настаиваете… В классе java.lang.System присутствует статический метод getenv(). Давайте попробуем им воспользоваться (но помните - это вы меня заставили!). Для этого в программу включается следующая строка:
      System.out.println("System.getnv(\"PATH\")="+System.getenv("PATH"));
      Попробуем ее откомпилировать:
      C:\ javasrc>javac GetEnv.java
      Note: GetEnv.java uses or overrides a deprecated API. Recompile with "-deprecation" for details. Ничего хорошего от подобных сообщений ждать не приходится. Последуем данному совету:
      C:\ javasrc>javac -deprecation GetEnv.java
      GetEnv.java:9: Note: The method java.lang.String getenv(java.lang.String) in class java.lang.System has been deprecated.
      System.out.println("System.getenv(\"PATH\")= " + System.getenv("PATH"));
      Note: GetEnv.java uses or overrides a deprecated API. Please consult the documentation for a better alternative.
      1 warning
      Но это всего лишь предупреждение, не правда ли? Попробуем запустить программу.
      C:\ javasrc>javac GetEnv
      Exception in thread "main" java.lang.Error: getenv no longer supported, use properties and -D instead:PATH
      at java.lang.System.getenv(System.java:602)
      at GetEnv.main(GetEnv.java:9)
      Классический случай обратной несовместимости - программа работает в JDK 1.1, но не работает в Java 2. Надо сделать то, что рекомендуется в строке с ошибкой, то есть получить информацию относительно "свойств и параметра -D". Об этом и рассказывается в следующем разделе.
      2.2. Свойства системы
      Задача
      Получить информацию о свойствах системы.
      Решение
      Используйте методыметод;getProperty()метод;getProperties() System.getProperty() и System.getProperties().
      Комментарий
      Что такое свойство? Свойство - это пара, состоящая из имени и значения, хранящаяся в объекте java.util.Properties, более подробно описанном в главе 7.7. При желании можно хранить следующие свойства в объекте Properties с названием ian:
      name=Ian Darwin
      favorite_popsicle=cherry
      favorite_rock group=Fleetwood Mac
      favorite_programming_language=Java
      pencil color=green
      В классе Properties имеется несколько форм поискового метода (retrieval me?thod). Например, можно ввести ian.getProperty ("pencil color") и получить в ответ строку "green". Можно задать значение по умолчанию: введите ian.getProperty ("pencil color", "black"), - если свойство не было задано, по умолчанию используется значение "black".
      Займемся классом System и его ролью в качестве хранителя отдельного объекта Properties, контролирующего и описывающего состояние исполнительной среды Java. В классе System имеется статический член Properties, содержание которого является сплавом особенностей операционной системы (os.name, например), особенностей взаимодействия системы и пользователя (java.class.path) и свойств, заданных в командной строке (в чем можно будет убедиться немного позднее). Обратите внимание, что использование точек в этих именах (например, os.arch, os.version и java.class.path, java.lang.version) напоминает иерархические отношения, свойственные именам классов. Класс Properties, однако, не налагает подобных отношений: каждый ключ представляет собой обычную строку, а точки не имеют особой интерпретации.
      Чтобы получить одно системное свойство, используйте метод System.get?Pro?perty(). Если требуются все свойства, используйте метод System.getProperties(). Соответственно, чтобы выяснить, имеется ли в System Properties свойство "pencil color", нужно написать:
      String color = System.getProperty("pencil color");
      Что получится в результате? Разумеется, Java понятия не имеет о том, кто и какого цвета карандаши предпочитает. При помощи аргумента -D можно сообщить Java о своем любимом цвете (или о чем-либо еще).
      Аргумент -D используется для присваивания значений системных свойств. Аргумент состоит из имени, знака равенства и значения и анализируется по тем же правилам, как в файле свойств (смотрите ниже). В командах Java после имени класса могут следовать несколько определений -D. В режиме командной строки систем Unix или MS-Windows команда выглядит так:
      java -D"pencil color=Deep Sea Gree" SysPropDemo
      В MRJ или IDE нужно ввести имя переменной и ее значение в соответствующем диалоговом окне при выполнении программы. Программа SysPropDemo невелика, и состоит фактически из одной строки:
      System.getProperties(). List(System.out);
      По завершении работы программа выдает около 50 строк, выглядящих следующим образом:
      java.library.path=/usr/local/linux-jdkl1.2/jre/lib/i386/…
      java.vm.specification.vendor=Sun Microsystems Inc.
      sun.io.unicode.encoding=UnicodeLittle
      pencil color=Deep Sea Green
      file.encoding=ANSI_X3.4-1968
      java.specification.vendor=Sun Microsystems Inc.
      user.language=en
      В программе также предусмотрена возможность получения одного или нескольких свойств, поэтому возможен и другой вариант запуска:
      $ java SysPropDemo os.arch
      os.arch = x86
      Дополнительная информация
      В документации Javadoc, посвященной java.util.Properties, дана подробная информация и перечислены четкие правила, использующиеся при вызове метода load().
      В главе 7.7 подробно описано использование и выбор имен собственных файлов Properties.
      2.3. Разработка кода, зависящего от версий JDK
      Задача
      Написать код, зависящий от особенностей конкретной версии JDK.
      Решение
      Не делайте этого.
      Комментарий
      Хотя Java и реализована в качестве переносимого языка, между Java-программами существуют серьезные различия. Иногда приходится ломать голову над тем, каким образом использовать свойство, возможно, отсутствующее в предыдущих версиях. Поэтому первым делом требуется выяснить, какая версия JDK соответствует исполнительной среде Java. Это нетрудно сделать с помощью метода System.getProperty():
      System.out.println(System.getProperty("java.specification.version"));
      В Java 2 после этой команды на экране появится сообщение 1.2, соответствующее версии JDK 1.2. Но не все так просто. Программа Kaffe 1.5 несомненно обладает некоторыми свойствами Java 2, но все же не воспроизводит полностью библиотеки Java 2. Однако она также представляет себя как 1.2. Будьте осторожны!
      Узнать об отсутствии или наличии отдельных классов можно с помощью методаметод;forName() Class.forName("class"), выдающего исключение, если класс не удается загрузить, - признак того, что класс попросту отсутствует в библиотеке программы. Следующий фрагмент позволяет проверить доступность компонентов JDK версии 1.1 и выше:
      /**Проверка JDK>=1.1*/
      public class TestJDK11{
      public static void main(String[] a){
      //Check for JDK>=1.1
      try{
      Class.forName("java.lang.reflect.Constructor");
      }catch (ClassNotFoundException e){
      String failure =
      "Sorry, but this version of MyApp needs \n +
      "a Java Runtime based on Java JDK 1.1 or later";
      System.err.println(failure);
      Throw new IllegalArgumentException(failure);
      }
      System.out.println("Happy to report that this is JDK1.1");
      // Продолжение программы...
      return;
      }
      }
      Чтобы проверить, включает ли в себя программа компоненты Swing вместе с их окончательными именами (final names) , можно использовать запись:
      Class.forName("javax.swing.JButton");
      Необходимо различать подобную проверку на стадии компиляции и на стадии выполнения программы. В обоих случаях этот код требуется компилировать в системе, включающей искомые классы, - JDK 1.1 или Swing соответственно. Тем не менее подобные проверки являются лишь слабыми попытками помочь пользователю старой исполнительной среды Java, старающемуся запустить новейшее приложение. Цель - обеспечить пользователя более значимой информацией, нежели простым сообщением "class not found" (класс не найден), выдаваемым программой. Очень важно помнить, что применение подобной проверки невозможно, если выполнять ее из кода, зависящего от тестируемого кода. Поиск Swing будет безрезультатен, если задать его в конструкторе подкласса JPanel (примите это к сведению). Осуществите проверку как можно раньше в основной нити, прежде чем начинать конструировать объекты графического пользовательского интерфейса GUI. В противном случае код просто займет лишнее пространство в системах Java 2, так и не добравшись до систем Java 1.1.
      Класс Class подробно рассматривается в главе 25.
      2.4. Создание кода, зависящего от операционной системы
      Задача
      Написать код, зависящий от операционной системы, в которой он выполняется.
      Решение
      Не делайте этого. В случае необходимости воспользуйтесь System.properties.
      Комментарий
      В то время как язык Java теоретически является переносимым, некоторые его компоненты все же таковыми не являются. В их число входит такая переменная, как разделитель файловых имен (filename separator). Всякий пользователь Unix знает, что для разделения файловых имен используется символ (/) (slash), а символ (\) (backslash) является служебным префиксом. Вернемся в конец 1970-х годов, когда программисты корпорации Microsoft работали над созданием своей версии Unix, называвшейся Xenix (позднее работа над ней была продолжена в SCO). Предложенная модель файловой системы для Unix была одобрена программистами, работавшими над созданием DOS. В MS-DOS версии 2.0, абсолютном аналоге системы Digital Research CP/M (в свою очередь являвшейся клоном различных подобных систем), вместо каталогов использовались номера пользователя (user numbers). В итоге корпорация Microsoft приняла решение заимствовать организацию файловой системы (filesystem organization) у Unix. К сожалению, символ (/) уже был зарезервирован в качестве пре
      фик?са параметров, в то время как в Unix для этой цели использовалось тире (-), а двое?точие (:) было задействовано для имен дисков, например C: или A:. Из-за этого и возникли различия в синтаксисе команд Unix и DOS:
     
      Система Команда просмотра каталога Значение Пример задания PATH
      Unix ls-R / Рекурсивный вывод содержимого / (каталог верхнего уровня) PATH=/bin:/usr/bin
      DOS dir/s \ Рекурсивный (то есть с включением подкаталогов) вывод содержимого \ (каталог верхнего уровня, но только для текущего диска) PATH=C:\windows; D:\mybins
      О чем это говорит? При создании имен Java-файлов необходимо знать, какой из символов (/, \ или какой-либо еще) использовать. Например, на компьютерах Mac имена файлов отделяются от имен каталогов двоеточиями (:). Java предлагает два решения подобной проблемы. Первое: в программе можно использовать любой из символов / и \; код взаимодействия с операционной системой сам во всем разберется. Второе (более общее): Java позволяет получить ?информацию об особенностях платформы независимым от платформы образом. Во-первых, для разделителя файлов (file separator), а также для разделителя PATH, в классе java.io.File (см. главу 10) определяются статические переменные. Поскольку класс File зависит от платформы, представляется логичным привести информацию относительно этих переменных ниже:
     
      Имя переменной Тип Значение
      Separator static String Символ разделителя имен файлов, зависящего от системы; например, / или \
      separatorChar static char Символ разделителя имен файлов, зависящего от системы; например, / или \
      PathSeparator static String Символ разделителя пути, зависящего от системы, представленный для удобства в форме строки
      PathSeparatorChar static char Символ разделителя пути, зависящего от системы
      Как разделитель имени файлов, так и разделитель пути - обычные символы, для удобства доступные также в форме String.
      Во-вторых, более общим механизмом является системный объект Properties, упомянутый в разделе 2.2. С его помощью можно определить, с какой системой вы работаете. Следующий фрагмент просто перечисляет системные свойства. Для наглядности его рекомендуется выполнить в нескольких разных системах.
      import java.util.*;
      /**
      * Вывести свойства системы
      */
      public class SysPropDemo{
      public static void main(String argv[]){
      System.out.println("System Properties:");
      Properties p = System.getProperties();
      p.list(System.out);
      }
      }
      В некоторых операционных системах, к примеру, присутствует механизм под названием нулевое устройство (the null device), применяющийся для снятия вывода данных (обычно используется в целях экономии времени). Следующий фрагмент запрашивает системное свойство os.name и в зависимости от полученного значения выбирает имя для сброса данных. Если в платформе не поддерживается нулевое устройство, выбирается имя junk; таким образом, на таких плат?формах данные будут сбрасываться в специальные "мусорные" файлы. Я просто удаляю такие файлы, когда они попадаются мне на глаза.
      /**Компоненты, зависящие от системы.
      *Все методы статические, как в java.lang.Math.
      */
      public class SysDep{
      /**Вернуть имя нулевого устройства на платформах, поддерживающих его; в противном случае создать "jnk".
      */
      public static string getDevNull(){
      String sys = System.getProperty("os.name");
      if (sys==null || sys.indexOf"Mac")>=0)
      return "junk";
      if (sys.startsWith("Windows"))
      return "NUL:";
      return "/dev/null";
      }
      }
      2.5. Эффективное использование переменной окружения CLASSPATH
      Задача
      Разместить класс-файлы в общем каталоге или воспользоваться переменной окруженияCLASSPATH CLASSPATH.
      Решение
      Задайте путь к необходимым каталогам и/или архивам JAR, содержащим классы, в переменной окружения CLASSPATH.
      Комментарий
      Переменная CLASSPATH - один из наиболее интересных аспектов работы с Java. Можно хранить класс-файлы в любом из многочисленных каталогов, архивов JAR или ZIP. Подобно переменной PATH, используемой системой для поиска ?про?грамм, переменная CLASSPATH используется в Java-программах для поиска классов. Даже в таком простом случае, как с java HelloWorld, Java-интерпретатор проводит поиск в каждом из каталогов, заданных в переменной CLASSPATH. Рассмотрим пример.
      Переменную CLASSPATH можно установить как переменную окружения в тех системах, где эта возможность поддерживается (Unix, MS-Windows). Синтаксис новой переменной соответствует стандартному синтаксису переменной окружения PATH. Переменная PATH содержит список каталогов для поиска программ; переменная CLASSPATH - список каталогов или JAR-архивов для поиска классов.
      Значение переменной CLASSPATH можно задать прямо в командной строке:
      Java -classpath \c:\ian\classes MyProg
      Предположим, что в переменной CLASSPATH задано C:\classes;. в системе MS-Windows или ~/classes:. в системе Unix (в системе Mac можно задать CLASSPATH с помощью программы JBindery). Также предположим, что вы только что скомпилировали файл HelloWorld.java в HelloWorld.class и запустили его. В Unix, если вы пользуетесь одной из утилит трассировки на уровне ядра (trace, strace, truss, ktrace), Java-программа последовательно обратится к следующим файлам:
      некоторые файлы в каталоге JDK;
      затем файл ~/classes/HelloWorld.class, который, вероятно, не будет найден;
      файл ./HelloWorld.class, который программа найдет, откроет и считает в память.
      Расплывчатая формулировка "некоторые файлы в JDK-каталоге" зависит от версии системы. В JDK 1.2 эти файлы перечислены в системных свойствах:
      Sun.boot.class.path = C:\JDK1.2\JRE\lib\rt.jar;C:\JDK1.2\JRE\lib\i18n.jar;C:\JDK1.2\JRE\classes
      Файл rt.jar принадлежит Java-программе; i18n.jar - локализация; classes - каталог, в котором можно установить дополнительные классы.
      Предположим, вы установили архив JAR с классами программ из этой книги, com-darwynsys-util.jar. В переменной CLASSPATH задается значение C:\classes; C:\ classes\com-darwynsys-util.jar; в MS-Windows или ~/classes:~/classes/com-darwynsys-util.jar:. в Unix. Учтите, что имя JAR-файла должно быть задано явно. В отличие от единственного класс-файла, установки архива JAR в каталог, указанный в переменной CLASSPATH, еще недостаточно для того, чтобы сделать его доступным.
      Обратите внимание, что некоторые специализированные программы, такие как web-сервер, выполняющий сервлеты (см. главу 18), не используют ни переменную загрузки (bootpath), ни CLASSPATH вышеописанным способом. В них имеется свой собственный загрузчик ClassLoader (загрузчики классов рассматриваются в разделе 25.4).
      Еще одной полезной составляющей JDK является javap, по умолчанию выдающая информацию о класс-файле: его полное имя, открытые методы и поля и т. д. Если запустить команду javap HelloWorld при трассировке уровня ядра, то вначале она откроет, найдет и прочитает файл \jdk\lib\tools.jar, а затем займет?ся по?иском класса HelloWorld. Однако в настройке CLASSPATH подобное задание отсутствует. Программа javap самостоятельно устанавливает в переменной CLASSPATH настройку включения файла tools.jar. Самостоятельно сделать то же самое не так легко, как кажется. При попытке настроить setProperty (java.class.path) на самое себя, затем добавить ограничитель (delimiter) и jdk/lib/tools.jar класс JavaP (sun.tools.java.JavaP) не будет найден. Переменная CLASSPATH задается в java. class.path в самом начале выполнения, еще до запуска программы. Попробуйте задать ее вручную и убедитесь в том, что она работает:
      C:\ javasrc>java -classpath/jdk1.2/lib/tools.jar sun.tools.javap.JavaP
      Usage: javap ј
      Если потребуется выполнить это из приложения, можно либо задать ее в стартовом сценарии, как предложено выше, либо написать C-код для запуска Java, что подробно описано в разделе 26.5.
      Как задать CLASSPATH, чтобы класс-файлы сохранялись в каталоге? В команде javac имеется параметр -d для определения каталога, в который должен поступать вывод компилятора. Например, следующая команда помещает класс-файл HelloWorld в каталог /classes:
      Javac -d /classes Helloworld.Java
      До тех пор пока данный каталог записан в CLASSPATH, доступ к класс-файлу можно осуществить независимо от текущего каталога. Это одно из ключевых достоинств использования CLASSPATH.
      Управление переменной CLASSPATH иногда вызывает проблемы, особенно при использовании нескольких виртуальных машин Java (Java Virtual machine, JVM) или большом количестве каталогов для поиска JAR-архивов. В этих случаях обычно используется специальный пакетный файл или сценарий. Приведем часть сценария, созданного для оболочки Korn в Unix, которым пользуется автор этой книги. (Аналогичные сценарии можно написать и для оболочки С, и для пакетных файлов DOS.)
      #Эти компоненты должны присутствовать в моей classpath...
      export CLASSPATH=/home/ian/classes/com-darwinsys-util.jar:
      # Цикл проверки .jar/.zip или [-d...]
      OPT_JARS="$HOME/classes $HOME/classes/*.jar
      $(JAVAHOME)/jre/lib/ext/*.jar
      /usr/local/antlr-2.6.0"
      for thing in $OPT_JARS
      do
      if [-f $thing ]; then must be either a fileј
      CLASSPATH="$CLASSPATH:$thing"
      Else if [ -d $thing ]; then //or a directory
      CLASSPATH="$CLASSPATH:$thing"
      Fi
      Done
      CLASSPATH="$CLASSPATH:."
      Данный сценарий создает минимальную переменную CLASSPATH из архива com.darwinsys-util.jar, затем проверяет список файлов и каталогов, чтобы удостовериться в их наличии в этой системе (я использую такой сценарий в нескольких виртуальных машинах в сети), а по завершении проверки ставит точку (.) в конце переменной CLASSPATH.
      2.6. Использование расширений или других API
      Задача
      Использовать имеющиесяJAR JAR-архивы классов.
      Решение
      Скопируйте JAR-архив в каталог JDKHOME/jre/lib/ext/.
      Комментарий
      Программный интерфейс Java API прошел большой путь со времени своего первого появления в 1995 году. В наши дни он считается достаточно полным для создания надежно работающих приложений, причем сферы его применения продолжают расширяться. Существует много специализированных API, требующих большего количества ресурсов, нежели имеется в отдельной Java-платформе. Многие из новых API корпорации Sun предлагаются в форме стандартных расширений (standard extension), для обозначения этого их пакетные имена начинаются с javax. Web-браузер, к примеру, в целях безопасности апплетов воспринимает классы в пакетах java или javax в качестве встроенных (built-in) классов. Расширения распространяются в форме JAR-архивов (см. раздел 23.3).
      В версии Java 1.1 или ее аналогах потребуется добавить все JAR-файлы в вашу переменную CLASSPATH, как описано в разделе 2.5.
      В Java 2, по мере накопления различных API, содержащихся в JAR-архивах, можно просто добавить JAR-архивы в каталог расширений Java (обычно \jdk1.2\jre\lib\ext.) вместо перечисления всех JAR-архивов в переменной CLASSPATH. Никаких дополнительных действий более не потребуется, программа Java 2 самостоятельно просмотрит этот каталог при поиске архивов JAR или ZIP. В отличие от других изменений в системе, не надо даже перезагружать компьютер, поскольку этот каталог сканируется каждый раз при запуске виртуальной машины Java (Java Virtual Machine, JVM). Впрочем, чтобы изменения вступили в силу, вам все же придется перезапустить IDE.
      2.7. Анализ параметров командной строки
      Задача
      Проанализировать параметры командной строки. В Java нет API, предоставляющего такую возможность.
      Решение
      Воспользуйтесь массивом args, передаваемым main в качестве аргумента, или классом GetOpt .
      Комментарий
      Задача анализа командной строки возникла перед пользователями Unix очень давно, поэтому для ее решения в библиотеку С была включена функция getopt . Функция getopt обрабатывает аргументы командной строки в поисках односимвольных параметров с тире и дополнительных параметров. К примеру, команда:
      sort -n -o outfile myfile1 yourfile2
      запускает стандартную программу sort. Параметр -n сообщает, что сортируемые данные являются не текстовыми, а числовыми; параметр -o outfile указывает на то, что вывод программы направляется в файл outfile. Слова myfile1 и yourfile2 интерпретируются как имена входных файлов, требующих сортировки. На платформах Microsoft (таких, как Windows 95) аргументы команд ной строки обозначаются префиксом /. В книге будет использоваться стандартный для Unix символ "дефис"(-), однако при желании вы можете заменить его наклонной чертой.
      Как и в C, метод getopt() применяется в цикле while. Он последовательно обрабатывает все найденные параметры и возвращает либо найденный символ, либо ноль после обработки всех параметров.
      Следующая программа с классом getopt проверяет, присутствует ли в командной строке параметр вызова справки -h:
      import com.darwinsys.util.GetOpt;
      /**Банальный пример использования GetOpt.
      * Если в командной строке присутствует ключ -h,
      * вывести справочную информацию.
      */
      public class GetOptsimple {
      public static void main (String[] args) {
      GetOpt go = new GetOpt ("h");
      char c;
      while ((c = go.getopt(args)) !=0 {
      switch(c) {
      case 'h':
      helpAndExit(0);
      break;
      default:
      System.err.println("Unknown option in"+
      Args[go.getOptInd()-1]);
      HelpAndExit(1);
      }
      }
      System.out.println();
      }
      /** Программная заглушка для вывода справки.
      */
      static void helpAndExit (int returnValue) {
      System.err.println("This would tell you how to use this program");
      System.exit(returnValue);
      }
      }
      В следующей демонстрационной программе (demo) имеется несколько параметров:
      import com.darwinsys.util.GetOpt;
      /** Простой пример использования GetOpt.
      * Параметры '-n' и '-o outfile' управляют сортировкой,
      * параметр '-h' включает вывод справки.
      */
      public class GetOptDemo {
      public static void main (String[] args) {
      GetOpt go = new GetOpt ("hno:");
      boolean numeric_option = false;
      String outFileName = "(standard output)";
      char c;
      while ((c = go.getopt(args)) !=GetOpt.DONE) {
      switch(c) {
      case 'h':
      doHelp(0);
      break;
      case 'n':
      numeric_option = true;
      break;
      case 'o':
      outFileName = go.optarg();
      break;
      default:
      System.err.println("Unknown option in "+ c);
      doHelp(1);
      }
      }
      System.out.print("Options: ");
      System.out.print("Numeric: " + numeric_option +' ');
      System.out.print("Output: " + outFileName + "; ");
      System.out.println("Inputs: ");
      If (go.getOptInd()-1 == args.length) {
      DoFile("(standard input)");
      } else for (int I=go.getOptInd()-1; I      doFile(args[I]);
      }
      /** Программная заглушка для вывода справки.
      */
      static void helpAndExit (int returnValue) {
      System.err.println("Usage: GetOptDemo [-h] [-n] [-o outfile] file...");
      System.exit(returnValue);
      }
      /** Обработка одного файла.*/
      static void doFile(String fileName){
      System.out.println(fileName+ ' ');
      }
      }
      Если многократно вызвать эту программу с разными параметрами, она будет вести себя следующим образом:
      C:\ javasrc\environ>java GetOptDemo
      Options: Numeric: false Output: (standard output); Input: (standard input)
      C:\ javasrc\environ>java GetOptDemo -h
      Usage: GetOptDemo [-h] [-n] [-o outfile] file…
      C:\ javasrc\environ>java GetOptDemo -n a b c
      Options: Numeric: true Output: (standard output); Input: b c
      C:\ javasrc\environ>java GetOptDemo -n -o resultfile file1 file2
      Options: Numeric: true Output: resultfile ; Input: file2
      Рассмотрим еще один пример использования GetOpt:
      public class GetOptTest {
      public static void main(String argv[]) {
      String goodArgChars = "o:h", goodArgs[] = {
      "-h", "-o", "outfile", "infile"
      };
      String badArgChars = "flo", badArgs[] = {
      "-h", "-o", "outfile", "infile"
      };
      process(goodArgChars, goodArgs);
      process(badArgChars, goodArgs);
      process(badArgChars, badArgs);
      }
      /** Закрытая функция для тестирования.*/
      private static void process(String argChars, String[] args) {
      System.out.println("**START** " + argChars + '(' + args.length + ')');
      GetOpt go = new GetOpt(argChars);
      char c;
      while ((c = go.getopt(args)) !=0) {
      System.out.print("Found" + c);
      if (go.optarg() !=null)
      System.out.print("; Option " + go.optarg());
      System.out.print();
      }
      for (int I=go.optind(); I      }
      }
      Следующая программа (использовавшаяся для тестирования класса GetOpt, в процессе работы над ним) демонстрирует несколько успешных и намеренно неуспешных вариантов использования getopt. Результаты и ошибки выводятся по мере их появления:
      $ java GetOptTest
      **START**o:h(4)
      Found h
      Found o; Option outfile
      **START**flo(4)
      Bad option
      Found o
      Filename-like arg infile
      At least one user error found
      **START**flo(4)
      Bad option
      Found o
      Filename-like arg infile
      At least one user error found
      $
      GetOpt неплохо справляется с обработкой параметров командной строки. При желании вы можете написать собственный, улучшенный вариант этой программы и внести свою лепту в мир Java.
     

Java. Сборник рецептов для профессионалов. / Я. Дарвин - СПб: Питер, 2002. - 768 с.

Экономика и управление | Право/a> | Бухгалтерский учет и налоги |