Предисловие | 15 |
|
Для кого эта книга | 16 |
Что в этой книге? | 16 |
Замечания относительно платформ | 19 |
Соглашения, использованные в этой книге | 20 |
Получение исходного кода | 21 |
|
От издательства | 22 |
|
Глава 1. Начало: компиляция, выполнение, отладка | гз |
|
1.0. Вступление | 23 |
1.1. Компиляция и выполнение программ на языке Java: JDK | 23 |
1.2. Редактирование и компиляция в редакторах с цветовым выделением синтаксиса | 28 |
1.3. Компиляция, выполнение и тестирование в интегрированной среде разработки | 29 |
1.4. Использование классов из примеров этой книги | 33 |
1.5. Автоматическая компиляция при помощи сценария jr | 34 |
1.6. Автоматизация компиляции при помощи make-файла | 35 |
1.7. Автоматизация компиляции при помощи программы Ant | 36 |
1.8. Выполнение апплетов | 39 |
1.9. Действия при выдаче предупреждений | 41 |
1.10. Условная отладка без #ifdef | 42 |
1.11. Вывод отладочной информации | 44 |
1.12. Работа с отладчиком | 45 |
1.13. Модульное тестирование | 47 |
1.14. Декомпиляция класс-файлов Java | 49 |
1.15. Предотвращение декомпиляции Java-файлов | 51 |
1.16. Получение годных для чтения трассировок | 52 |
1.17. Поиск исходных текстов на языке Java | 54 |
1.18. Программа Debug | 55 |
|
Глава 2. Взаимодействие со средой | 57 |
|
2.0. Вступление | 57 |
2.1. Получение переменных окружения | 57 |
2.2. Свойства системы | 58 |
2.3. Разработка кода, зависящего от версий JDK | 60 |
2.4. Создание кода, зависящего от операционной системы | 61 |
2.5. Эффективное использование переменной окружения CLASSPATH | 64 |
2.6. Использование расширений или других API | 66 |
2.7. Анализ параметров командной строки | 67 |
|
Глава 3. Строки | 7i |
|
3.0. Вступление | 71 |
3.1. Разбивка строк на подстроки | 73 |
3.2. Разбор строк при помощи StringTokenizer | 74 |
3.3. Конкатенация строк | 77 |
3.4. Посимвольная обработка строки | 78 |
3.5. Выравнивание строк | 79 |
3.6. Преобразование между строками и символами Unicode | 81 |
3.7. Инверсия строк по словам или символам | 83 |
3.8. Расширение и сжатие табуляций | 84 |
3.9. Преобразования регистра символов | 88 |
3.10. Отступы и выступы в текстовых документах | 89 |
3.11. Ввод непечатаемых символов | 90 |
3.12. Удаление пробелов в конце строки | 91 |
3.13. Лексический разбор данных, разделённых запятыми | 92 |
3.14. Программа: обычный текстовый форматтер | 97 |
3.15. Приблизительный поиск имён | 99 |
|
Глава 4. Поиск с применением регулярных выражений | 102 |
|
4.0. Вступление | 102 |
4.1. Синтаксис регулярного выражения | 104 |
4.2. Как работают регулярные выражения | 107 |
4.3. Регулярные выражения в Java | 108 |
4.4. Интерактивное тестирование регулярных выражений | 110 |
4.5. Получение совпавшего текста | 111 |
4.6. Замена по шаблону | 112 |
4.7. Печать всех экземпляров шаблона | 113 |
4.8. Вывод строк, содержащих совпадения | 114 |
4.9. Управление регистром символов при вызовах match() и subst() | 116 |
4.10. Предварительная компиляция регулярных выражений | 117 |
4.11. Поиск символов конца строки | 118 |
4.12. Программа извлечения данных | 119 |
4.13. Полная версия программы Grep | 121 |
|
Глава 5. Числа | 125 |
|
5.0. Вступление | 125 |
5.1. Проверка строковых представлений чисел | 127 |
5.2. Хранение больших чисел в переменной меньшего типа | 128 |
5.3. Умножение целого на дробь без вычислений с плавающей точкой | 129 |
5.4. Точность чисел с плавающей точкой | 130 |
5.5. Сравнение чисел с плавающей точкой | 132 |
5.6. Округление чисел с плавающей точкой | 134 |
5.7. Форматирование чисел | 134 |
5.8. Преобразования двоичных, восьмеричных, десятичных |
и шестнадцатеричных чисел | 137 |
5.9. Последовательности целых чисел | 138 |
5.10. Римские цифры | 139 |
5.11. Форматирование в соответствии с множественным числом |
имён существительных | 143 |
5.12. Генерирование случайных чисел | 144 |
5.13. Генерирование случайных чисел (лучший способ) | 145 |
5.14. Вычисление тригонометрических функций | 146 |
5.15. Вычисление логарифмов | 146 |
5.16. Умножение матриц | 147 |
5.17. Комплексные числа | 149 |
5.18. Очень большие числа | 151 |
5.19. Программа TempConverter | 152 |
5.20. Программа создания чисел-палиндромов | 156 |
|
Глава 6. Даты и время | 159 |
|
6.0. Вступление | 159 |
6.1. Поиск текущей даты | 160 |
6.2. Вывод даты и времени в определённом формате | 161 |
6.3. Представление дат в других календарях | 163 |
6.4. Преобразование YMDHMS в Calendar или Date | 164 |
6.5. Разбор строк на даты | 165 |
6.6. Преобразование секунд эпохи в DMYHMS | 166 |
6.7. Сложение или вычитание из даты или календаря | 167 |
6.8. Разность между двумя датами | 168 |
6.9. Сравнение дат | 169 |
6.10. Порядковый номер дня недели, месяца, года или недели | 171 |
6.11. Страница календаря | 172 |
6.12. Таймеры высокого разрешения | 174 |
6.13. Пауза | 176 |
6.14. Программа ReminderService | 176 |
|
Глава 7. Структуры данных в Java | 179 |
|
7.0. Вступление | 179 |
7.1. Хранение данных в массивах | 180 |
7.2. Изменение размеров массива | 181 |
7.3. Динамический массив | 183 |
7.4. Универсальный механизм доступа к данным с использованием итераторов | 185 |
7.5. Хранение данных в связанном списке | 186 |
7.6. Хранение ассоциативных данных в классах Hashtable и HashMap | 188 |
7.7. Сохранение строк в классах Properties и Preferences | 189 |
7.8. Сортировка коллекции | 192 |
7.9. Сортировка в Java 1.1 | 195 |
7.10. Автоматическая сортировка | 196 |
7.11. Множества | 198 |
7.12. Поиск объекта в коллекции | 199 |
7.13. Преобразование коллекции в массив | 201 |
7.14. Самостоятельная реализация итераторов | 202 |
7.15. Стек | 203 |
7.16. Многомерные структуры данных | 205 |
7.17. Коллекции | 207 |
7.18. Пример: хронометраж | 208 |
|
Глава 8. Объектно-ориентированное программирование | 211 |
|
8.0. Вступление | 211 |
8.1. Печать объектов: форматирование с помощью метода toString() | 213 |
8.2. Переопределение метода Equals | 214 |
8.3. Переопределение метода Hashcode | 217 |
8.4. Метод Clone | 218 |
8.5. Метод Finalize | 220 |
8.6. Вложенные классы | 221 |
8.7. Обратные вызовы через интерфейсы | 222 |
8.8. Полиморфизм и абстрактные методы | 226 |
8.9. Передача значений | 227 |
8.10. Создание собственных исключений | 230 |
8.11. Программа Plotter | 231 |
|
Глава 9. Ввод/вывод | 234 |
|
9.0. Вступление | 234 |
9.1. Чтение стандартного ввода | 238 |
9.2. Программирование стандартного вывода | 240 |
9.3. Открытие файла по имени | 241 |
9.4. Копирование файла | 242 |
9.5. Чтение файла в строку | 245 |
9.6. Переназначение стандартных потоков | 246 |
9.7. Дублирование потока при записи | 247 |
9.8. Чтение и запись в разных кодировках | 249 |
9.9. Символы новой строки | 250 |
9.10. Зависящий от платформы код файла | 251 |
9.11. Чтение продолженных строк | 252 |
9.12. Сканирование файла | 256 |
9.13. Двоичные данные | 260 |
9.14. Поиск | 261 |
9.15. Запись потоков данных из языка С | 262 |
9.16. Сохранение и восстановление сериализованных объектов | 263 |
9.17. Борьба с исключениями ClassCastExceptions с помощью SerialVersionUID | 265 |
9.18. Чтение и запись архивов JAR или ZIP | 267 |
9.19. Чтение и запись сжатых файлов | 270 |
9.20. Программа: вывод текста на устройствах PostScript | 271 |
9.21. Программа: TarList (конвертер файлов) | 274 |
|
Глава 10. Операции с каталогами и файловой системой | 286 |
|
10.0. Вступление | 286 |
10.1. Получение информации о файле | 286 |
10.2. Создание файла | 289 |
10.3. Переименование файла | 290 |
10.4. Удаление файла | 291 |
10.5. Создание временного файла | 293 |
10.6. Изменение атрибутов файла | 294 |
10.7. Создание списка содержимого каталога | 295 |
10.8. Получение списка корневых каталогов | 298 |
10.9. Создание новых каталогов | 299 |
10.10. Программа Find | 299 |
|
Глава 11. Программирование последовательных |
и параллельных портов | 303 |
|
11.0. Вступление | 303 |
11.1. Выбор порта | 305 |
11.2. Открытие последовательного порта | 308 |
11.3. Открытие параллельного порта | 312 |
11.4. Разрешение конфликтов портов | 315 |
11.5. Чтение и запись: Lock Step | 318 |
11.6. Чтение и запись: управление на основе событий | 321 |
11.7. Чтение и запись: нити | 325 |
11.8. Программа: Penman Plotter | 327 |
|
Глава 12. Графика и звук | 332 |
|
12.0. Вступление | 332 |
12.1. Рисование с помощью объекта Graphics | 333 |
12.2. Тестирование графических компонентов | 334 |
12.3. Вывод текста | 335 |
12.4. Вывод центрированного текста в компоненте | 335 |
12.5. Вывод текста с эффектом тени | 337 |
12.6. Вывод рисунка | 339 |
12.7. Проигрывание звукового файла | 344 |
12.8. Вывод видео | 345 |
12.9. Вывод текста с помощью объекта Graphics2D | 348 |
12.10. Печать в JDK 1.1 | 350 |
12.11. Печать в Java 2 | 353 |
12.12. Программа PlotterAWT | 355 |
12.13. Программа Grapher | 357 |
|
Глава 13. Графический интерфейс пользователя | 362 |
|
13.0. Вступление | 362 |
13.1. Вывод компонентов графического интерфейса пользователя | 363 |
13.2. Проектирование разметки окна | 365 |
13.3. Использование вкладок | 367 |
13.4. Обработка событий: заставляем кнопки работать | 368 |
13.5. Обработка событий с использованием анонимных внутренних классов | 371 |
13.6. Прерывание программы при закрытии окна | 372 |
13.7. Диалоговые окна | 376 |
13.8. Показ вывода программы в окне | 378 |
13.9. Выбор файла с помощью класса JFileChooser | 382 |
13.10. Выбор цвета | 384 |
13.11. Центрирование главного окна | 387 |
13.12. Изменение вида и поведения программы с использованием пакета Swing | 388 |
13.13. Программа выбора цветов | 392 |
13.14. Программа: собственный менеджер разметки | 396 |
|
Глава 14. Интернационализация и локализация | 403 |
|
14.0. Вступление | 403 |
14.1. Создание кнопок с помощью ресурсов интернационализации | 403 |
14.2. Вывод списка доступных локальных контекстов | 405 |
14.3. Создание меню с помощью ресурсов интернационализации | 406 |
14.4. Создание процедур интернационализации | 407 |
14.5. Создание диалоговых окон с помощью ресурсов интернационализации | 409 |
14.6. Создание пакета ресурсов | 410 |
14.7. Обработка кода с помощью JILT | 411 |
14.8. Использование конкретного локального контекста настроек | 412 |
14.9. Установка локального контекста по умолчанию | 413 |
14.10. Форматирование сообщений | 414 |
14.11. Программа Menulntl | 416 |
14.12. Программа BusCard | 418 |
|
Глава 15. Сетевые клиенты | 422 |
|
15.0. Вступление | 422 |
15.1. Связь с сервером | 424 |
15.2. Поиск сетевых адресов | 425 |
15.3. Обработка сетевых ошибок | 427 |
15.4. Чтение и запись текстовых данных | 427 |
15.5. Чтение и запись двоичных данных | 430 |
15.6. Чтение и запись данных, преобразованных в последовательную форму | 432 |
15.7. Дейтаграммы UDP | 433 |
15.8. Программа: клиент TFTP UDP | 436 |
15.9. Программа: клиент Telnet | 440 |
15.10. Программа: клиент для интерактивного обмена сообщениями | 442 |
|
Глава 16. Java на стороне сервера: сокеты | 448 |
|
16.0. Вступление | 448 |
16.1. Открытие сервера для бизнеса | 448 |
16.2. Возвращение отклика (строкового или двоичного) | 451 |
16.3. Возвращение информации об объекте | 455 |
16.4. Поддержка многих клиентов | 455 |
16.5. Регистрация событий по сети | 460 |
16.6. Программа: сервер для интерактивного обмена сообщениями | 465 |
|
Глава 17. Сетевые клиенты II: апплеты и web-клиенты | 470 |
|
17.0. Вступление | 470 |
17.1. Внедрение технологии Java в web-страницы | 470 |
17.2. Программирование апплетов | 472 |
17.3. Связывание сервера с хостом апплета | 475 |
17.4. Как заставить апплет показывать документ | 477 |
17.5. Как заставить апплет запускать сценарий CGI | 479 |
17.6. Чтение содержимого URL | 480 |
17.7. Извлечение кода HTML из URL | 481 |
17.8. Извлечение URL из файла | 483 |
17.9. Преобразование имени файла в URL | 485 |
17.10. Программа Mklndex | 486 |
17.11. Программа LinkChecker | 490 |
|
Глава 18. Java на web-сервере: сервлеты и JSP | 498 |
|
18.0. Вступление | 498 |
18.1. Первый сервлет: построение страницы HTML | 499 |
18.2. Сервлеты: обработка параметров формы | 502 |
18.3. Элементы Cookie | 505 |
18.4. Отслеживание сеансов | 508 |
18.5. Генерирование документа в формате PDF из сервлета | 514 |
18.6. Интеграция HTML с Java: JSP | 519 |
18.7. Директивы JSP Include и Forward | 524 |
18.8. Использование сервлетов в JSP | 525 |
18.9. Упрощение вашего кода JSP с помощью компонента JavaBean | 526 |
18.10. Сводка синтаксиса JSP | 530 |
18.11. Программа CookieCutter | 530 |
18.12. Программа: web-портал новостей JabaDot | 531 |
|
Глава 19. Язык Java и электронная почта | 542 |
|
19.0. Вступление | 542 |
19.1. Отправка электронной почты: версия для браузера | 543 |
19.2. Отправка электронной почты: для реального использования | 547 |
19.3. Работа с почтой в серверной программе | 549 |
19.4. Посылка почты в кодировке MIME | 555 |
19.5. Установка почтовых настроек | 557 |
19.6. Отправка почты без использования JavaMail | 559 |
19.7. Чтение электронной почты | 563 |
19.8. Программа MailReaderBean | 567 |
19.9. Программа MailClient | 571 |
|
Глава 20. Доступ к базам данных | 582 |
|
20.0. Вступление | 582 |
20.1. Текстовые файлы в роли баз данных | 583 |
20.2. Базы данных DBM | 588 |
20.3. Установка JDBC и соединение | 591 |
20.4. Подключение к базе данных JDBC | 594 |
20.5. Отправка запроса JDBC и получение результатов | 596 |
20.6. Использование параметризованных выражений JDBC | 599 |
20.7. Использование хранимых процедур с JDBC | 603 |
20.8. Изменение данных с помощью объекта ResultSet | 604 |
20.9. Изменение данных с помощью SQL | 605 |
20.10. Поиск метаданных JDBC | 607 |
20.11. Программа JDAdmin | 613 |
|
Глава 21. XML | 620 |
|
21.0. Вступление | 620 |
21.1. Преобразование документа XML с помощью XSLT | 623 |
21.2. Синтаксический разбор документа XML с помощью SAX | 625 |
21.3. Синтаксический разбор документа XML с помощью DOM | 627 |
21.4. Проверка структуры с помощью DTD | 629 |
21.5. Построение документов XML с помощью DOM | 630 |
21.6. Программа xml2mif | 632 |
|
Глава 22. Распределённые приложения Java: RMI | 635 |
|
22.0. Вступление | 635 |
22.1. Определение контракта RMI | 636 |
22.2. Клиент RMI | 638 |
22.3. Сервер RMI | 639 |
22.4. Использование RMI по сети | 641 |
22.5. Программа: обратные вызовы RMI | 642 |
22.6. Программа RMIWatch | 646 |
|
Глава 23. Пакеты и упаковка | 653 |
|
23.0. Вступление | 653 |
23.1. Создание пакета | 654 |
23.2. Документирование классов с помощью Javadoc | 655 |
23.3. Архивирование с помощью программы JAR | 658 |
23.4. Запуск апплета из архива JAR | 659 |
23.5. Запуск апплета с использованием JDK | 660 |
23.6. Запуск программы из архива JAR | 663 |
23.7. Подготовка класса как компонента JavaBean | 664 |
23.8. Упаковка компонента в архив JAR | 667 |
23.9. Упаковка сервлета в файл WAR | 668 |
23.10. «Написанное однажды устанавливается везде» | 669 |
23.11. Java WebStart | 670 |
23.12. Добавление подписи к файлу JAR | 675 |
|
Глава 24. Нити в языке Java | 677 |
|
24.0. Вступление | 677 |
24.1. Выполнение кода в другой нити | 678 |
24.2. Вывод движущегося изображения с анимацией | 682 |
24.3. Остановка работы нити | 685 |
24.4. Встречи и тайм-ауты | 687 |
24.5. Взаимодействие нитей: синхронизированный код | 689 |
24.6. Взаимодействие нитей: методы wait() и notifyAII() | 695 |
24.7. Фоновое сохранение в редакторе | 700 |
24.8. Сетевой сервер с использованием нитей | 701 |
|
Глава 25. Самоанализ или «класс под названием Class» | 710 |
|
25.0. Вступление | 710 |
25.1. Получение дескриптора файла | 711 |
25.2. Поиск и использование методов и полей | 712 |
25.3. Динамическая загрузка и создание экземпляра класса | 715 |
25.4. Создание класса с нуля | 718 |
25.5. Хронометраж | 719 |
25.6. Вывод информации о классе | 722 |
25.7. Программа CrossRef | 724 |
25.8. Программа AppletViewer | 729 |
|
Глава 26. Использование языка Java с другими языками | 736 |
|
26.0. Вступление | 736 |
26.1. Запуск программы | 736 |
26.2. Запуск программы и перехват её вывода | 739 |
26.3. Объединение кода Java и сценариев с помощью BSF | 743 |
26.4. Вызов родного кода C/C++ | 747 |
26.5. Вызов кода Java из кода C/C++ | 753 |
26.6. Программа DBM | 753 |
|
Послесловие | 757 |
|
Алфавитный указатель | 759 |